/*
 *
 *    Copyright (c) 2022 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.
 */

// THIS FILE IS GENERATED BY ZAP

#pragma once

#if CONFIG_ENABLE_YAML_TESTS

#include <commands/common/Commands.h>
#include <commands/tests/TestCommand.h>
#include <lib/core/Optional.h>
#include <lib/support/CHIPListUtils.h>
#include <system/SystemClock.h>

#include <math.h> // For INFINITY

class TestList : public Command
{
public:
    TestList() : Command("list"){};
    CHIP_ERROR Run() override
    {
        printf("TestAccessControlCluster\n");
        printf("Test_TC_ACL_1_1\n");
        printf("Test_TC_ACL_2_1\n");
        printf("Test_TC_ACL_2_2\n");
        printf("Test_TC_BOOL_1_1\n");
        printf("Test_TC_BOOL_2_1\n");
        printf("Test_TC_ACT_1_1\n");
        printf("Test_TC_BIND_1_1\n");
        printf("Test_TC_CC_1_1\n");
        printf("Test_TC_CC_2_1\n");
        printf("Test_TC_CC_3_2\n");
        printf("Test_TC_CC_3_3\n");
        printf("Test_TC_CC_4_1\n");
        printf("Test_TC_CC_4_2\n");
        printf("Test_TC_CC_4_3\n");
        printf("Test_TC_CC_4_4\n");
        printf("Test_TC_CC_5_1\n");
        printf("Test_TC_CC_5_2\n");
        printf("Test_TC_CC_5_3\n");
        printf("Test_TC_CC_6_1\n");
        printf("Test_TC_CC_6_2\n");
        printf("Test_TC_CC_6_3\n");
        printf("Test_TC_CC_7_2\n");
        printf("Test_TC_CC_7_3\n");
        printf("Test_TC_CC_7_4\n");
        printf("Test_TC_CC_8_1\n");
        printf("Test_TC_OPCREDS_1_2\n");
        printf("Test_TC_BINFO_1_1\n");
        printf("Test_TC_BINFO_2_1\n");
        printf("Test_TC_CNET_1_3\n");
        printf("Test_TC_DESC_1_1\n");
        printf("Test_TC_DLOG_1_1\n");
        printf("Test_TC_DGETH_1_1\n");
        printf("Test_TC_DGETH_2_1\n");
        printf("Test_TC_DGETH_2_2\n");
        printf("Test_TC_FLW_1_1\n");
        printf("Test_TC_FLW_2_1\n");
        printf("Test_TC_FLABEL_1_1\n");
        printf("Test_TC_FLABEL_2_1\n");
        printf("Test_TC_CGEN_1_1\n");
        printf("Test_TC_CGEN_2_1\n");
        printf("Test_TC_DGGEN_1_1\n");
        printf("Test_TC_DGGEN_2_1\n");
        printf("Test_TC_I_1_1\n");
        printf("Test_TC_I_2_1\n");
        printf("Test_TC_I_2_2\n");
        printf("Test_TC_I_2_3\n");
        printf("Test_TC_ILL_1_1\n");
        printf("Test_TC_ILL_2_1\n");
        printf("Test_TC_ILL_2_2\n");
        printf("Test_TC_LVL_1_1\n");
        printf("Test_TC_LVL_2_1\n");
        printf("Test_TC_LVL_2_2\n");
        printf("Test_TC_LVL_3_1\n");
        printf("Test_TC_LVL_4_1\n");
        printf("Test_TC_LVL_5_1\n");
        printf("Test_TC_LVL_6_1\n");
        printf("Test_TC_LCFG_1_1\n");
        printf("Test_TC_LUNIT_1_2\n");
        printf("Test_TC_LTIME_1_2\n");
        printf("Test_TC_LOWPOWER_1_1\n");
        printf("Test_TC_KEYPADINPUT_1_2\n");
        printf("Test_TC_APPLAUNCHER_1_3\n");
        printf("Test_TC_MEDIAINPUT_1_4\n");
        printf("Test_TC_WAKEONLAN_1_5\n");
        printf("Test_TC_CHANNEL_1_6\n");
        printf("Test_TC_MEDIAPLAYBACK_1_7\n");
        printf("Test_TC_AUDIOOUTPUT_1_8\n");
        printf("Test_TC_TGTNAV_1_9\n");
        printf("Test_TC_TGTNAV_8_2\n");
        printf("Test_TC_APBSC_1_10\n");
        printf("Test_TC_CONTENTLAUNCHER_1_11\n");
        printf("Test_TC_ALOGIN_1_12\n");
        printf("Test_TC_LOWPOWER_2_1\n");
        printf("Test_TC_KEYPADINPUT_3_2\n");
        printf("Test_TC_KEYPADINPUT_3_3\n");
        printf("Test_TC_APPLAUNCHER_3_5\n");
        printf("Test_TC_APPLAUNCHER_3_6\n");
        printf("Test_TC_APPLAUNCHER_3_7\n");
        printf("Test_TC_APPLAUNCHER_3_8\n");
        printf("Test_TC_APPLAUNCHER_3_9\n");
        printf("Test_TC_MEDIAINPUT_3_10\n");
        printf("Test_TC_MEDIAINPUT_3_11\n");
        printf("Test_TC_MEDIAINPUT_3_12\n");
        printf("Test_TC_MEDIAINPUT_3_13\n");
        printf("Test_TC_CHANNEL_5_1\n");
        printf("Test_TC_CHANNEL_5_2\n");
        printf("Test_TC_CHANNEL_5_3\n");
        printf("Test_TC_MEDIAPLAYBACK_6_1\n");
        printf("Test_TC_MEDIAPLAYBACK_6_2\n");
        printf("Test_TC_MEDIAPLAYBACK_6_3\n");
        printf("Test_TC_MEDIAPLAYBACK_6_4\n");
        printf("Test_TC_AUDIOOUTPUT_7_1\n");
        printf("Test_TC_AUDIOOUTPUT_7_2\n");
        printf("Test_TC_TGTNAV_8_1\n");
        printf("Test_TC_APBSC_9_1\n");
        printf("Test_TC_CONTENTLAUNCHER_10_1\n");
        printf("Test_TC_MOD_1_1\n");
        printf("OTA_SuccessfulTransfer\n");
        printf("Test_TC_OCC_1_1\n");
        printf("Test_TC_OCC_2_1\n");
        printf("Test_TC_OO_1_1\n");
        printf("Test_TC_OO_2_1\n");
        printf("Test_TC_OO_2_2\n");
        printf("Test_TC_OO_2_4\n");
        printf("Test_TC_PS_1_1\n");
        printf("Test_TC_PS_2_1\n");
        printf("Test_TC_PRS_1_1\n");
        printf("Test_TC_PRS_2_1\n");
        printf("Test_TC_PRS_2_2\n");
        printf("Test_TC_PCC_1_1\n");
        printf("Test_TC_PCC_2_1\n");
        printf("Test_TC_PCC_2_2\n");
        printf("Test_TC_PCC_2_3\n");
        printf("Test_TC_PCC_2_4\n");
        printf("Test_TC_PSCFG_1_1\n");
        printf("Test_TC_PSCFG_2_1\n");
        printf("Test_TC_RH_1_1\n");
        printf("Test_TC_RH_2_1\n");
        printf("Test_TC_SWTCH_1_1\n");
        printf("Test_TC_SWTCH_2_1\n");
        printf("Test_TC_TMP_1_1\n");
        printf("Test_TC_TMP_2_1\n");
        printf("Test_TC_TSTAT_1_1\n");
        printf("Test_TC_TSTAT_2_1\n");
        printf("Test_TC_TSTAT_2_2\n");
        printf("Test_TC_TSUIC_1_1\n");
        printf("Test_TC_TSUIC_2_1\n");
        printf("Test_TC_TSUIC_2_2\n");
        printf("Test_TC_DGTHREAD_1_1\n");
        printf("Test_TC_DGTHREAD_2_1\n");
        printf("Test_TC_DGTHREAD_2_2\n");
        printf("Test_TC_DGTHREAD_2_3\n");
        printf("Test_TC_DGTHREAD_2_4\n");
        printf("Test_TC_ULABEL_1_1\n");
        printf("Test_TC_ULABEL_2_1\n");
        printf("Test_TC_ULABEL_2_2\n");
        printf("Test_TC_ULABEL_2_3\n");
        printf("Test_TC_ULABEL_2_4\n");
        printf("Test_TC_DGWIFI_1_1\n");
        printf("Test_TC_DGWIFI_2_1\n");
        printf("Test_TC_DGWIFI_2_3\n");
        printf("Test_TC_WNCV_1_1\n");
        printf("Test_TC_WNCV_2_1\n");
        printf("Test_TC_WNCV_2_2\n");
        printf("Test_TC_WNCV_2_3\n");
        printf("Test_TC_WNCV_2_4\n");
        printf("Test_TC_WNCV_2_5\n");
        printf("Test_TC_WNCV_3_1\n");
        printf("Test_TC_WNCV_3_2\n");
        printf("Test_TC_WNCV_3_3\n");
        printf("Test_TC_WNCV_3_4\n");
        printf("Test_TC_WNCV_3_5\n");
        printf("Test_TC_WNCV_4_1\n");
        printf("Test_TC_WNCV_4_2\n");
        printf("Test_TC_WNCV_4_3\n");
        printf("Test_TC_WNCV_4_4\n");
        printf("Test_TC_WNCV_4_5\n");
        printf("TV_TargetNavigatorCluster\n");
        printf("TV_AudioOutputCluster\n");
        printf("TV_ApplicationLauncherCluster\n");
        printf("TV_KeypadInputCluster\n");
        printf("TV_AccountLoginCluster\n");
        printf("TV_WakeOnLanCluster\n");
        printf("TV_ApplicationBasicCluster\n");
        printf("TV_MediaPlaybackCluster\n");
        printf("TV_ChannelCluster\n");
        printf("TV_LowPowerCluster\n");
        printf("TV_ContentLauncherCluster\n");
        printf("TV_MediaInputCluster\n");
        printf("TestCASERecovery\n");
        printf("TestCluster\n");
        printf("TestClusterComplexTypes\n");
        printf("TestConstraints\n");
        printf("TestDelayCommands\n");
        printf("TestEvents\n");
        printf("TestDiscovery\n");
        printf("TestLogCommands\n");
        printf("TestSaveAs\n");
        printf("TestConfigVariables\n");
        printf("TestDescriptorCluster\n");
        printf("TestBasicInformation\n");
        printf("TestFabricRemovalWhileSubscribed\n");
        printf("TestGeneralCommissioning\n");
        printf("TestIdentifyCluster\n");
        printf("TestOperationalCredentialsCluster\n");
        printf("TestModeSelectCluster\n");
        printf("TestSelfFabricRemoval\n");
        printf("TestSystemCommands\n");
        printf("TestBinding\n");
        printf("TestUserLabelCluster\n");
        printf("TestUserLabelClusterConstraints\n");
        printf("TestArmFailSafe\n");
        printf("TestFanControl\n");
        printf("TestAccessControlConstraints\n");
        printf("TestLevelControlWithOnOffDependency\n");
        printf("TestCommissioningWindow\n");
        printf("TestMultiAdmin\n");
        printf("Test_TC_DGSW_1_1\n");
        printf("TestSubscribe_OnOff\n");
        printf("TestSubscribe_AdministratorCommissioning\n");
        printf("DL_UsersAndCredentials\n");
        printf("DL_LockUnlock\n");
        printf("DL_Schedules\n");
        printf("Test_TC_DRLK_1_1\n");
        printf("Test_TC_DRLK_2_2\n");
        printf("Test_TC_DRLK_2_3\n");
        printf("Test_TC_DRLK_2_4\n");
        printf("Test_TC_DRLK_2_5\n");
        printf("Test_TC_DRLK_2_7\n");
        printf("Test_TC_DRLK_2_9\n");
        printf("TestGroupMessaging\n");
        printf("TestGroupsCluster\n");
        printf("TestGroupKeyManagementCluster\n");
        printf("Test_TC_G_1_1\n");
        printf("Test_TC_G_2_1\n");

        return CHIP_NO_ERROR;
    }
};

class ManualTestList : public Command
{
public:
    ManualTestList() : Command("list-manual"){};
    CHIP_ERROR Run() override
    {
        printf("Test_TC_DD_1_5\n");
        printf("Test_TC_DD_1_6\n");
        printf("Test_TC_DD_1_7\n");
        printf("Test_TC_DD_1_8\n");
        printf("Test_TC_DD_1_9\n");
        printf("Test_TC_DD_1_10\n");
        printf("Test_TC_DD_1_11\n");
        printf("Test_TC_DD_1_12\n");
        printf("Test_TC_DD_1_13\n");
        printf("Test_TC_DD_1_14\n");
        printf("Test_TC_DD_1_15\n");
        printf("Test_TC_DD_2_1\n");
        printf("Test_TC_DD_2_2\n");
        printf("Test_TC_DD_3_1\n");
        printf("Test_TC_DD_3_2\n");
        printf("Test_TC_DD_3_3\n");
        printf("Test_TC_DD_3_4\n");
        printf("Test_TC_DD_3_5\n");
        printf("Test_TC_DD_3_6\n");
        printf("Test_TC_DD_3_7\n");
        printf("Test_TC_DD_3_8\n");
        printf("Test_TC_DD_3_9\n");
        printf("Test_TC_DD_3_10\n");
        printf("Test_TC_DD_3_11\n");
        printf("Test_TC_DD_3_12\n");
        printf("Test_TC_DD_3_13\n");
        printf("Test_TC_DD_3_14\n");
        printf("Test_TC_DD_3_15\n");
        printf("Test_TC_DD_3_16\n");
        printf("Test_TC_DD_3_17\n");
        printf("Test_TC_DD_3_18\n");
        printf("Test_TC_DD_3_19\n");
        printf("Test_TC_DD_3_20\n");
        printf("Test_TC_DD_3_21\n");
        printf("TestGroupDemoCommand\n");
        printf("TestGroupDemoConfig\n");
        printf("Test_TC_G_2_2\n");
        printf("Test_TC_G_2_3\n");
        printf("Test_TC_G_3_1\n");
        printf("Test_TC_G_3_2\n");
        printf("Test_TC_BDX_1_1\n");
        printf("Test_TC_BDX_1_2\n");
        printf("Test_TC_BDX_1_3\n");
        printf("Test_TC_BDX_1_4\n");
        printf("Test_TC_BDX_1_5\n");
        printf("Test_TC_BDX_1_6\n");
        printf("Test_TC_BDX_2_1\n");
        printf("Test_TC_BDX_2_2\n");
        printf("Test_TC_BDX_2_3\n");
        printf("Test_TC_BDX_2_4\n");
        printf("Test_TC_BDX_2_5\n");
        printf("Test_TC_BR_1\n");
        printf("Test_TC_BR_2\n");
        printf("Test_TC_BR_3\n");
        printf("Test_TC_BR_4\n");
        printf("Test_TC_DA_1_1\n");
        printf("Test_TC_DA_1_2\n");
        printf("Test_TC_DA_1_3\n");
        printf("Test_TC_DA_1_4\n");
        printf("Test_TC_DA_1_5\n");
        printf("Test_TC_DA_1_6\n");
        printf("Test_TC_DA_1_7\n");
        printf("Test_TC_BINFO_2_2\n");
        printf("Test_TC_BINFO_2_4\n");
        printf("Test_TC_OPCREDS_3_1\n");
        printf("Test_TC_OPCREDS_3_2\n");
        printf("Test_TC_OPCREDS_3_3\n");
        printf("Test_TC_OPCREDS_3_4\n");
        printf("Test_TC_CNET_4_1\n");
        printf("Test_TC_CNET_4_2\n");
        printf("Test_TC_CNET_4_3\n");
        printf("Test_TC_CNET_4_4\n");
        printf("Test_TC_CNET_4_5\n");
        printf("Test_TC_CNET_4_6\n");
        printf("Test_TC_CNET_4_9\n");
        printf("Test_TC_CNET_4_10\n");
        printf("Test_TC_CNET_4_11\n");
        printf("Test_TC_CNET_4_12\n");
        printf("Test_TC_CNET_4_13\n");
        printf("Test_TC_CNET_4_14\n");
        printf("Test_TC_CNET_4_15\n");
        printf("Test_TC_CNET_4_16\n");
        printf("Test_TC_CNET_4_17\n");
        printf("Test_TC_CNET_4_18\n");
        printf("Test_TC_CNET_4_19\n");
        printf("Test_TC_CNET_4_20\n");
        printf("Test_TC_CNET_4_21\n");
        printf("Test_TC_CNET_4_22\n");
        printf("Test_TC_DLOG_2_1\n");
        printf("Test_TC_DLOG_2_2\n");
        printf("Test_TC_DLOG_3_1\n");
        printf("Test_TC_DESC_2_1\n");
        printf("Test_TC_DESC_2_2\n");
        printf("Test_TC_DGETH_3_1\n");
        printf("Test_TC_DGETH_3_2\n");
        printf("Test_TC_CGEN_2_2\n");
        printf("Test_TC_CGEN_2_4\n");
        printf("Test_TC_DGGEN_2_2\n");
        printf("Test_TC_DGGEN_2_3\n");
        printf("Test_TC_DGGEN_3_1\n");
        printf("Test_TC_I_3_1\n");
        printf("Test_TC_I_3_2\n");
        printf("Test_TC_ILL_3_1\n");
        printf("Test_TC_IDM_1_1\n");
        printf("Test_TC_IDM_1_2\n");
        printf("Test_TC_IDM_2_1\n");
        printf("Test_TC_IDM_2_2\n");
        printf("Test_TC_IDM_3_1\n");
        printf("Test_TC_IDM_3_2\n");
        printf("Test_TC_IDM_4_1\n");
        printf("Test_TC_IDM_4_2\n");
        printf("Test_TC_IDM_4_3\n");
        printf("Test_TC_IDM_5_1\n");
        printf("Test_TC_IDM_5_2\n");
        printf("Test_TC_IDM_6_1\n");
        printf("Test_TC_IDM_6_2\n");
        printf("Test_TC_IDM_6_3\n");
        printf("Test_TC_IDM_6_4\n");
        printf("Test_TC_IDM_7_1\n");
        printf("Test_TC_IDM_8_1\n");
        printf("Test_TC_LOWPOWER_2_2\n");
        printf("Test_TC_APPLAUNCHER_3_7_1\n");
        printf("Test_TC_APPLAUNCHER_3_8_1\n");
        printf("Test_TC_APPLAUNCHER_3_9_1\n");
        printf("Test_TC_MEDIAINPUT_3_14\n");
        printf("Test_TC_MEDIAINPUT_3_15\n");
        printf("Test_TC_MEDIAINPUT_3_16\n");
        printf("Test_TC_MEDIAINPUT_3_17\n");
        printf("Test_TC_WAKEONLAN_4_1\n");
        printf("Test_TC_CHANNEL_5_4\n");
        printf("Test_TC_CHANNEL_5_5\n");
        printf("Test_TC_CHANNEL_5_6\n");
        printf("Test_TC_KEYPADINPUT_3_1\n");
        printf("Test_TC_MEDIAPLAYBACK_6_5\n");
        printf("Test_TC_MEDIAPLAYBACK_6_7\n");
        printf("Test_TC_AUDIOOUTPUT_7_3\n");
        printf("Test_TC_AUDIOOUTPUT_7_4\n");
        printf("Test_TC_CONTENTLAUNCHER_10_3\n");
        printf("Test_TC_CONTENTLAUNCHER_10_4\n");
        printf("Test_TC_CONTENTLAUNCHER_10_5\n");
        printf("Test_TC_CONTENTLAUNCHER_10_7\n");
        printf("Test_TC_MC_11_1\n");
        printf("Test_TC_MC_11_2\n");
        printf("Test_TC_ALOGIN_12_1\n");
        printf("Test_TC_ALOGIN_12_2\n");
        printf("Test_TC_CADMIN_1_1\n");
        printf("Test_TC_CADMIN_1_2\n");
        printf("Test_TC_CADMIN_1_7\n");
        printf("Test_TC_CADMIN_1_8\n");
        printf("Test_TC_CADMIN_1_11\n");
        printf("Test_TC_CADMIN_1_12\n");
        printf("Test_TC_CADMIN_1_14\n");
        printf("Test_TC_CADMIN_1_15\n");
        printf("Test_TC_CADMIN_1_16\n");
        printf("Test_TC_CADMIN_1_17\n");
        printf("Test_TC_CADMIN_1_18\n");
        printf("Test_TC_CADMIN_1_19\n");
        printf("Test_TC_CADMIN_1_20\n");
        printf("Test_TC_CADMIN_1_21\n");
        printf("Test_TC_CADMIN_1_22\n");
        printf("Test_TC_CADMIN_1_3\n");
        printf("Test_TC_CADMIN_1_4\n");
        printf("Test_TC_CADMIN_1_5\n");
        printf("Test_TC_CADMIN_1_6\n");
        printf("Test_TC_CADMIN_1_9\n");
        printf("Test_TC_CADMIN_1_10\n");
        printf("Test_TC_CADMIN_1_13\n");
        printf("Test_TC_CADMIN_1_23\n");
        printf("Test_TC_CADMIN_1_24\n");
        printf("Test_TC_MOD_1_2\n");
        printf("Test_TC_MOD_1_3\n");
        printf("Test_TC_MOD_2_1\n");
        printf("Test_TC_MOD_2_2\n");
        printf("Test_TC_MOD_3_1\n");
        printf("Test_TC_MOD_3_2\n");
        printf("Test_TC_MOD_3_3\n");
        printf("Test_TC_MOD_3_4\n");
        printf("Test_TC_SU_1_1\n");
        printf("Test_TC_SU_2_1\n");
        printf("Test_TC_SU_2_2\n");
        printf("Test_TC_SU_2_3\n");
        printf("Test_TC_SU_2_4\n");
        printf("Test_TC_SU_2_5\n");
        printf("Test_TC_SU_2_6\n");
        printf("Test_TC_SU_2_7\n");
        printf("Test_TC_SU_2_8\n");
        printf("Test_TC_SU_3_1\n");
        printf("Test_TC_SU_3_2\n");
        printf("Test_TC_SU_3_3\n");
        printf("Test_TC_SU_3_4\n");
        printf("Test_TC_SU_4_1\n");
        printf("Test_TC_SU_4_2\n");
        printf("Test_TC_PSCFG_2_2\n");
        printf("Test_TC_PSCFG_3_1\n");
        printf("Test_TC_SC_1_1\n");
        printf("Test_TC_SC_1_2\n");
        printf("Test_TC_SC_1_3\n");
        printf("Test_TC_SC_1_4\n");
        printf("Test_TC_SC_2_1\n");
        printf("Test_TC_SC_2_2\n");
        printf("Test_TC_SC_2_3\n");
        printf("Test_TC_SC_2_4\n");
        printf("Test_TC_SC_3_1\n");
        printf("Test_TC_SC_3_2\n");
        printf("Test_TC_SC_3_3\n");
        printf("Test_TC_SC_3_4\n");
        printf("Test_TC_SC_3_6\n");
        printf("Test_TC_SC_4_1\n");
        printf("Test_TC_SC_4_2\n");
        printf("Test_TC_SC_4_3\n");
        printf("Test_TC_SC_4_4\n");
        printf("Test_TC_SC_4_5\n");
        printf("Test_TC_SC_4_6\n");
        printf("Test_TC_SC_4_7\n");
        printf("Test_TC_SC_4_8\n");
        printf("Test_TC_SC_4_9\n");
        printf("Test_TC_SC_4_10\n");
        printf("Test_TC_SC_5_1\n");
        printf("Test_TC_SC_5_2\n");
        printf("Test_TC_SC_5_3\n");
        printf("Test_TC_SC_6_1\n");
        printf("Test_TC_DGSW_2_1\n");
        printf("Test_TC_DGSW_2_2\n");
        printf("Test_TC_DGSW_2_3\n");
        printf("Test_TC_DGSW_3_1\n");
        printf("Test_TC_DGSW_3_2\n");
        printf("Test_TC_DGWIFI_2_2\n");
        printf("Test_TC_DGWIFI_3_1\n");
        printf("Test_TC_DGWIFI_3_2\n");
        printf("Test_TC_WNCV_6_1\n");
        printf("Test_TC_WNCV_7_1\n");
        printf("Test_TC_FLW_2_2\n");
        printf("Test_TC_FLW_3_1\n");
        printf("Test_TC_OCC_2_2\n");
        printf("Test_TC_OCC_2_3\n");
        printf("Test_TC_OCC_2_4\n");
        printf("Test_TC_OCC_3_1\n");
        printf("Test_TC_PRS_3_1\n");
        printf("Test_TC_PS_2_2\n");
        printf("Test_TC_PS_3_1\n");
        printf("Test_TC_BOOL_2_2\n");
        printf("Test_TC_BOOL_3_1\n");
        printf("Test_TC_CC_2_2\n");
        printf("Test_TC_CC_3_4\n");
        printf("Test_TC_CC_4_5\n");
        printf("Test_TC_CC_5_4\n");
        printf("Test_TC_CC_6_4\n");
        printf("Test_TC_CC_7_5\n");
        printf("Test_TC_CC_9_4\n");
        printf("Test_TC_CC_3_1\n");
        printf("Test_TC_CC_7_1\n");
        printf("Test_TC_CC_9_1\n");
        printf("Test_TC_CC_9_2\n");
        printf("Test_TC_CC_9_3\n");
        printf("Test_TC_DRLK_2_1\n");
        printf("Test_TC_DRLK_2_6\n");
        printf("Test_TC_DRLK_2_8\n");
        printf("Test_TC_DRLK_2_10\n");
        printf("Test_TC_DRLK_3_1\n");
        printf("Test_TC_DRLK_3_2\n");
        printf("Test_TC_DRLK_3_3\n");
        printf("Test_TC_LCFG_2_1\n");
        printf("Test_TC_LCFG_3_1\n");
        printf("Test_TC_LVL_2_3\n");
        printf("Test_TC_LVL_7_1\n");
        printf("Test_TC_LVL_8_1\n");
        printf("Test_TC_OO_2_3\n");
        printf("Test_TC_OO_3_1\n");
        printf("Test_TC_OO_3_2\n");
        printf("Test_TC_RH_2_2\n");
        printf("Test_TC_RH_3_1\n");
        printf("Test_TC_SWTCH_2_2\n");
        printf("Test_TC_SWTCH_3_1\n");
        printf("Test_TC_SWTCH_3_2\n");
        printf("Test_TC_TMP_2_2\n");
        printf("Test_TC_TMP_3_1\n");
        printf("Test_TC_TSTAT_3_1\n");
        printf("Test_TC_TSTAT_3_2\n");
        printf("Test_TC_TSUIC_3_1\n");
        printf("Test_TC_DGTHREAD_2_5\n");
        printf("Test_TC_DGTHREAD_3_1\n");
        printf("Test_TC_DGTHREAD_3_2\n");
        printf("Test_TC_DGTHREAD_3_3\n");
        printf("Test_TC_DGTHREAD_3_4\n");
        printf("Test_TC_DGTHREAD_3_5\n");
        printf("Test_TC_ACT_2_1\n");
        printf("Test_TC_ACT_2_2\n");
        printf("Test_TC_ACT_3_1\n");
        printf("Test_TC_ACT_3_2\n");
        printf("Test_TC_LTIME_1_1\n");
        printf("Test_TC_LTIME_2_1\n");
        printf("Test_TC_LTIME_3_1\n");
        printf("Test_TC_LUNIT_1_1\n");
        printf("Test_TC_LUNIT_2_1\n");
        printf("Test_TC_LUNIT_3_1\n");
        printf("Test_TC_FLABEL_3_1\n");
        printf("Test_TC_BIND_2_1\n");
        printf("Test_TC_BIND_2_2\n");
        printf("Test_TC_BIND_2_3\n");
        printf("Test_TC_S_1_1\n");
        printf("Test_TC_S_2_1\n");
        printf("Test_TC_S_2_2\n");
        printf("Test_TC_S_2_3\n");
        printf("Test_TC_S_3_1\n");
        printf("Test_TC_PCC_3_1\n");
        printf("Test_TC_ACL_2_3\n");
        printf("Test_TC_ACL_2_4\n");
        printf("Test_TC_ACL_2_5\n");
        printf("Test_TC_ACL_2_6\n");
        printf("Test_TC_ACL_2_7\n");
        printf("Test_TC_ACL_2_8\n");
        printf("Test_TC_ACL_2_9\n");
        printf("Test_TC_ACL_2_10\n");
        printf("Test_TC_ULABEL_3_1\n");
        printf("Test_TC_BRBINFO_1_1\n");
        printf("Test_TC_BRBINFO_2_1\n");
        printf("Test_TC_BRBINFO_2_2\n");
        printf("Test_TC_BRBINFO_2_3\n");
        printf("Test_TC_ACE_1_1\n");
        printf("Test_TC_ACE_1_2\n");

        return CHIP_NO_ERROR;
    }
};

class TestAccessControlClusterSuite : public TestCommand
{
public:
    TestAccessControlClusterSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestAccessControlCluster", 24, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestAccessControlClusterSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 0));
                    VerifyOrReturn(CheckValue("acl[0].privilege", iter_0.GetValue().privilege, 5U));
                    VerifyOrReturn(CheckValue("acl[0].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNull("acl[0].subjects", iter_0.GetValue().subjects));
                    VerifyOrReturn(CheckValueNonNull("acl[0].targets", iter_0.GetValue().targets));
                    {
                        auto iter_3 = iter_0.GetValue().targets.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[0].targets.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValueNull("acl[0].targets.Value()[0].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(CheckValueNonNull("acl[0].targets.Value()[0].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(
                            CheckValue("acl[0].targets.Value()[0].endpoint.Value()", iter_3.GetValue().endpoint.Value(), 0U));
                        VerifyOrReturn(CheckValueNull("acl[0].targets.Value()[0].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[0].targets.Value()", iter_3, 1));
                        VerifyOrReturn(CheckValueNonNull("acl[0].targets.Value()[1].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(
                            CheckValue("acl[0].targets.Value()[1].cluster.Value()", iter_3.GetValue().cluster.Value(), 1UL));
                        VerifyOrReturn(CheckValueNull("acl[0].targets.Value()[1].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(CheckValueNull("acl[0].targets.Value()[1].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[0].targets.Value()", iter_3, 2));
                        VerifyOrReturn(CheckValueNonNull("acl[0].targets.Value()[2].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(
                            CheckValue("acl[0].targets.Value()[2].cluster.Value()", iter_3.GetValue().cluster.Value(), 2UL));
                        VerifyOrReturn(CheckValueNonNull("acl[0].targets.Value()[2].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(
                            CheckValue("acl[0].targets.Value()[2].endpoint.Value()", iter_3.GetValue().endpoint.Value(), 3U));
                        VerifyOrReturn(CheckValueNull("acl[0].targets.Value()[2].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(
                            CheckNoMoreListItems<decltype(iter_0.GetValue().targets.Value())>("acl[0].targets.Value()", iter_3, 3));
                    }
                    VerifyOrReturn(CheckValue("acl[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 1));
                    VerifyOrReturn(CheckValue("acl[1].privilege", iter_0.GetValue().privilege, 1U));
                    VerifyOrReturn(CheckValue("acl[1].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNonNull("acl[1].subjects", iter_0.GetValue().subjects));
                    {
                        auto iter_3 = iter_0.GetValue().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[1].subjects.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValue("acl[1].subjects.Value()[0]", iter_3.GetValue(), 4ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[1].subjects.Value()", iter_3, 1));
                        VerifyOrReturn(CheckValue("acl[1].subjects.Value()[1]", iter_3.GetValue(), 5ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[1].subjects.Value()", iter_3, 2));
                        VerifyOrReturn(CheckValue("acl[1].subjects.Value()[2]", iter_3.GetValue(), 6ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[1].subjects.Value()", iter_3, 3));
                        VerifyOrReturn(CheckValue("acl[1].subjects.Value()[3]", iter_3.GetValue(), 7ULL));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().subjects.Value())>("acl[1].subjects.Value()",
                                                                                                          iter_3, 4));
                    }
                    VerifyOrReturn(CheckValueNonNull("acl[1].targets", iter_0.GetValue().targets));
                    {
                        auto iter_3 = iter_0.GetValue().targets.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[1].targets.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValueNull("acl[1].targets.Value()[0].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(CheckValueNonNull("acl[1].targets.Value()[0].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(
                            CheckValue("acl[1].targets.Value()[0].endpoint.Value()", iter_3.GetValue().endpoint.Value(), 8U));
                        VerifyOrReturn(CheckValueNull("acl[1].targets.Value()[0].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[1].targets.Value()", iter_3, 1));
                        VerifyOrReturn(CheckValueNonNull("acl[1].targets.Value()[1].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(
                            CheckValue("acl[1].targets.Value()[1].cluster.Value()", iter_3.GetValue().cluster.Value(), 9UL));
                        VerifyOrReturn(CheckValueNull("acl[1].targets.Value()[1].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(CheckValueNull("acl[1].targets.Value()[1].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[1].targets.Value()", iter_3, 2));
                        VerifyOrReturn(CheckValueNonNull("acl[1].targets.Value()[2].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(
                            CheckValue("acl[1].targets.Value()[2].cluster.Value()", iter_3.GetValue().cluster.Value(), 10UL));
                        VerifyOrReturn(CheckValueNonNull("acl[1].targets.Value()[2].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(
                            CheckValue("acl[1].targets.Value()[2].endpoint.Value()", iter_3.GetValue().endpoint.Value(), 11U));
                        VerifyOrReturn(CheckValueNull("acl[1].targets.Value()[2].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(
                            CheckNoMoreListItems<decltype(iter_0.GetValue().targets.Value())>("acl[1].targets.Value()", iter_3, 3));
                    }
                    VerifyOrReturn(CheckValue("acl[1].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 2));
                    VerifyOrReturn(CheckValue("acl[2].privilege", iter_0.GetValue().privilege, 3U));
                    VerifyOrReturn(CheckValue("acl[2].authMode", iter_0.GetValue().authMode, 3U));
                    VerifyOrReturn(CheckValueNonNull("acl[2].subjects", iter_0.GetValue().subjects));
                    {
                        auto iter_3 = iter_0.GetValue().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[2].subjects.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValue("acl[2].subjects.Value()[0]", iter_3.GetValue(), 12ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[2].subjects.Value()", iter_3, 1));
                        VerifyOrReturn(CheckValue("acl[2].subjects.Value()[1]", iter_3.GetValue(), 13ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[2].subjects.Value()", iter_3, 2));
                        VerifyOrReturn(CheckValue("acl[2].subjects.Value()[2]", iter_3.GetValue(), 14ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[2].subjects.Value()", iter_3, 3));
                        VerifyOrReturn(CheckValue("acl[2].subjects.Value()[3]", iter_3.GetValue(), 15ULL));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().subjects.Value())>("acl[2].subjects.Value()",
                                                                                                          iter_3, 4));
                    }
                    VerifyOrReturn(CheckValueNonNull("acl[2].targets", iter_0.GetValue().targets));
                    {
                        auto iter_3 = iter_0.GetValue().targets.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[2].targets.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValueNull("acl[2].targets.Value()[0].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(CheckValueNonNull("acl[2].targets.Value()[0].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(
                            CheckValue("acl[2].targets.Value()[0].endpoint.Value()", iter_3.GetValue().endpoint.Value(), 16U));
                        VerifyOrReturn(CheckValueNull("acl[2].targets.Value()[0].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[2].targets.Value()", iter_3, 1));
                        VerifyOrReturn(CheckValueNonNull("acl[2].targets.Value()[1].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(
                            CheckValue("acl[2].targets.Value()[1].cluster.Value()", iter_3.GetValue().cluster.Value(), 17UL));
                        VerifyOrReturn(CheckValueNull("acl[2].targets.Value()[1].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(CheckValueNull("acl[2].targets.Value()[1].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[2].targets.Value()", iter_3, 2));
                        VerifyOrReturn(CheckValueNonNull("acl[2].targets.Value()[2].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(
                            CheckValue("acl[2].targets.Value()[2].cluster.Value()", iter_3.GetValue().cluster.Value(), 18UL));
                        VerifyOrReturn(CheckValueNonNull("acl[2].targets.Value()[2].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(
                            CheckValue("acl[2].targets.Value()[2].endpoint.Value()", iter_3.GetValue().endpoint.Value(), 19U));
                        VerifyOrReturn(CheckValueNull("acl[2].targets.Value()[2].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(
                            CheckNoMoreListItems<decltype(iter_0.GetValue().targets.Value())>("acl[2].targets.Value()", iter_3, 3));
                    }
                    VerifyOrReturn(CheckValue("acl[2].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acl", iter_0, 3));
                }
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 0));
                    VerifyOrReturn(CheckValue("acl[0].privilege", iter_0.GetValue().privilege, 5U));
                    VerifyOrReturn(CheckValue("acl[0].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNull("acl[0].subjects", iter_0.GetValue().subjects));
                    VerifyOrReturn(CheckValueNull("acl[0].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 1));
                    VerifyOrReturn(CheckValue("acl[1].privilege", iter_0.GetValue().privilege, 1U));
                    VerifyOrReturn(CheckValue("acl[1].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNull("acl[1].subjects", iter_0.GetValue().subjects));
                    VerifyOrReturn(CheckValueNull("acl[1].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[1].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acl", iter_0, 2));
                }
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 0));
                    VerifyOrReturn(CheckValue("acl[0].privilege", iter_0.GetValue().privilege, 5U));
                    VerifyOrReturn(CheckValue("acl[0].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNull("acl[0].subjects", iter_0.GetValue().subjects));
                    VerifyOrReturn(CheckValueNull("acl[0].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acl", iter_0, 1));
                }
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 0));
                    VerifyOrReturn(CheckValue("acl[0].privilege", iter_0.GetValue().privilege, 5U));
                    VerifyOrReturn(CheckValue("acl[0].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNull("acl[0].subjects", iter_0.GetValue().subjects));
                    VerifyOrReturn(CheckValueNull("acl[0].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acl", iter_0, 1));
                }
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 0));
                    VerifyOrReturn(CheckValue("acl[0].privilege", iter_0.GetValue().privilege, 5U));
                    VerifyOrReturn(CheckValue("acl[0].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNull("acl[0].subjects", iter_0.GetValue().subjects));
                    VerifyOrReturn(CheckValueNull("acl[0].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acl", iter_0, 1));
                }
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 0));
                    VerifyOrReturn(CheckValue("acl[0].privilege", iter_0.GetValue().privilege, 5U));
                    VerifyOrReturn(CheckValue("acl[0].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNull("acl[0].subjects", iter_0.GetValue().subjects));
                    VerifyOrReturn(CheckValueNull("acl[0].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acl", iter_0, 1));
                }
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 0));
                    VerifyOrReturn(CheckValue("acl[0].privilege", iter_0.GetValue().privilege, 5U));
                    VerifyOrReturn(CheckValue("acl[0].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNull("acl[0].subjects", iter_0.GetValue().subjects));
                    VerifyOrReturn(CheckValueNull("acl[0].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acl", iter_0, 1));
                }
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 0));
                    VerifyOrReturn(CheckValue("acl[0].privilege", iter_0.GetValue().privilege, 5U));
                    VerifyOrReturn(CheckValue("acl[0].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNull("acl[0].subjects", iter_0.GetValue().subjects));
                    VerifyOrReturn(CheckValueNull("acl[0].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acl", iter_0, 1));
                }
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_RESOURCE_EXHAUSTED));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 0));
                    VerifyOrReturn(CheckValue("acl[0].privilege", iter_0.GetValue().privilege, 5U));
                    VerifyOrReturn(CheckValue("acl[0].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNull("acl[0].subjects", iter_0.GetValue().subjects));
                    VerifyOrReturn(CheckValueNonNull("acl[0].targets", iter_0.GetValue().targets));
                    {
                        auto iter_3 = iter_0.GetValue().targets.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[0].targets.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValueNull("acl[0].targets.Value()[0].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(CheckValueNonNull("acl[0].targets.Value()[0].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(
                            CheckValue("acl[0].targets.Value()[0].endpoint.Value()", iter_3.GetValue().endpoint.Value(), 0U));
                        VerifyOrReturn(CheckValueNull("acl[0].targets.Value()[0].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[0].targets.Value()", iter_3, 1));
                        VerifyOrReturn(CheckValueNonNull("acl[0].targets.Value()[1].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(
                            CheckValue("acl[0].targets.Value()[1].cluster.Value()", iter_3.GetValue().cluster.Value(), 1UL));
                        VerifyOrReturn(CheckValueNull("acl[0].targets.Value()[1].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(CheckValueNull("acl[0].targets.Value()[1].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[0].targets.Value()", iter_3, 2));
                        VerifyOrReturn(CheckValueNonNull("acl[0].targets.Value()[2].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(
                            CheckValue("acl[0].targets.Value()[2].cluster.Value()", iter_3.GetValue().cluster.Value(), 2UL));
                        VerifyOrReturn(CheckValueNonNull("acl[0].targets.Value()[2].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(
                            CheckValue("acl[0].targets.Value()[2].endpoint.Value()", iter_3.GetValue().endpoint.Value(), 3U));
                        VerifyOrReturn(CheckValueNull("acl[0].targets.Value()[2].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(
                            CheckNoMoreListItems<decltype(iter_0.GetValue().targets.Value())>("acl[0].targets.Value()", iter_3, 3));
                    }
                    VerifyOrReturn(CheckValue("acl[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 1));
                    VerifyOrReturn(CheckValue("acl[1].privilege", iter_0.GetValue().privilege, 1U));
                    VerifyOrReturn(CheckValue("acl[1].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNonNull("acl[1].subjects", iter_0.GetValue().subjects));
                    {
                        auto iter_3 = iter_0.GetValue().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[1].subjects.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValue("acl[1].subjects.Value()[0]", iter_3.GetValue(), 4ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[1].subjects.Value()", iter_3, 1));
                        VerifyOrReturn(CheckValue("acl[1].subjects.Value()[1]", iter_3.GetValue(), 5ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[1].subjects.Value()", iter_3, 2));
                        VerifyOrReturn(CheckValue("acl[1].subjects.Value()[2]", iter_3.GetValue(), 6ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[1].subjects.Value()", iter_3, 3));
                        VerifyOrReturn(CheckValue("acl[1].subjects.Value()[3]", iter_3.GetValue(), 7ULL));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().subjects.Value())>("acl[1].subjects.Value()",
                                                                                                          iter_3, 4));
                    }
                    VerifyOrReturn(CheckValueNonNull("acl[1].targets", iter_0.GetValue().targets));
                    {
                        auto iter_3 = iter_0.GetValue().targets.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[1].targets.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValueNull("acl[1].targets.Value()[0].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(CheckValueNonNull("acl[1].targets.Value()[0].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(
                            CheckValue("acl[1].targets.Value()[0].endpoint.Value()", iter_3.GetValue().endpoint.Value(), 8U));
                        VerifyOrReturn(CheckValueNull("acl[1].targets.Value()[0].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[1].targets.Value()", iter_3, 1));
                        VerifyOrReturn(CheckValueNonNull("acl[1].targets.Value()[1].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(
                            CheckValue("acl[1].targets.Value()[1].cluster.Value()", iter_3.GetValue().cluster.Value(), 9UL));
                        VerifyOrReturn(CheckValueNull("acl[1].targets.Value()[1].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(CheckValueNull("acl[1].targets.Value()[1].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[1].targets.Value()", iter_3, 2));
                        VerifyOrReturn(CheckValueNonNull("acl[1].targets.Value()[2].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(
                            CheckValue("acl[1].targets.Value()[2].cluster.Value()", iter_3.GetValue().cluster.Value(), 10UL));
                        VerifyOrReturn(CheckValueNonNull("acl[1].targets.Value()[2].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(
                            CheckValue("acl[1].targets.Value()[2].endpoint.Value()", iter_3.GetValue().endpoint.Value(), 11U));
                        VerifyOrReturn(CheckValueNull("acl[1].targets.Value()[2].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(
                            CheckNoMoreListItems<decltype(iter_0.GetValue().targets.Value())>("acl[1].targets.Value()", iter_3, 3));
                    }
                    VerifyOrReturn(CheckValue("acl[1].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 2));
                    VerifyOrReturn(CheckValue("acl[2].privilege", iter_0.GetValue().privilege, 3U));
                    VerifyOrReturn(CheckValue("acl[2].authMode", iter_0.GetValue().authMode, 3U));
                    VerifyOrReturn(CheckValueNonNull("acl[2].subjects", iter_0.GetValue().subjects));
                    {
                        auto iter_3 = iter_0.GetValue().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[2].subjects.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValue("acl[2].subjects.Value()[0]", iter_3.GetValue(), 12ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[2].subjects.Value()", iter_3, 1));
                        VerifyOrReturn(CheckValue("acl[2].subjects.Value()[1]", iter_3.GetValue(), 13ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[2].subjects.Value()", iter_3, 2));
                        VerifyOrReturn(CheckValue("acl[2].subjects.Value()[2]", iter_3.GetValue(), 14ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[2].subjects.Value()", iter_3, 3));
                        VerifyOrReturn(CheckValue("acl[2].subjects.Value()[3]", iter_3.GetValue(), 15ULL));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().subjects.Value())>("acl[2].subjects.Value()",
                                                                                                          iter_3, 4));
                    }
                    VerifyOrReturn(CheckValueNonNull("acl[2].targets", iter_0.GetValue().targets));
                    {
                        auto iter_3 = iter_0.GetValue().targets.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[2].targets.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValueNull("acl[2].targets.Value()[0].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(CheckValueNonNull("acl[2].targets.Value()[0].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(
                            CheckValue("acl[2].targets.Value()[0].endpoint.Value()", iter_3.GetValue().endpoint.Value(), 16U));
                        VerifyOrReturn(CheckValueNull("acl[2].targets.Value()[0].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[2].targets.Value()", iter_3, 1));
                        VerifyOrReturn(CheckValueNonNull("acl[2].targets.Value()[1].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(
                            CheckValue("acl[2].targets.Value()[1].cluster.Value()", iter_3.GetValue().cluster.Value(), 17UL));
                        VerifyOrReturn(CheckValueNull("acl[2].targets.Value()[1].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(CheckValueNull("acl[2].targets.Value()[1].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[2].targets.Value()", iter_3, 2));
                        VerifyOrReturn(CheckValueNonNull("acl[2].targets.Value()[2].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(
                            CheckValue("acl[2].targets.Value()[2].cluster.Value()", iter_3.GetValue().cluster.Value(), 18UL));
                        VerifyOrReturn(CheckValueNonNull("acl[2].targets.Value()[2].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(
                            CheckValue("acl[2].targets.Value()[2].endpoint.Value()", iter_3.GetValue().endpoint.Value(), 19U));
                        VerifyOrReturn(CheckValueNull("acl[2].targets.Value()[2].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(
                            CheckNoMoreListItems<decltype(iter_0.GetValue().targets.Value())>("acl[2].targets.Value()", iter_3, 3));
                    }
                    VerifyOrReturn(CheckValue("acl[2].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acl", iter_0, 3));
                }
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 0));
                    VerifyOrReturn(CheckValue("acl[0].privilege", iter_0.GetValue().privilege, 5U));
                    VerifyOrReturn(CheckValue("acl[0].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNull("acl[0].subjects", iter_0.GetValue().subjects));
                    VerifyOrReturn(CheckValueNull("acl[0].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acl", iter_0, 1));
                }
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 4U));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 3U));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 3U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for commissionee");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Write entries");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(3);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(5);
                listHolder_0->mList[0].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(2);
                listHolder_0->mList[0].subjects.SetNull();
                listHolder_0->mList[0].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(3);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNull();
                    listHolder_3->mList[0].endpoint.SetNonNull();
                    listHolder_3->mList[0].endpoint.Value() = 0U;
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_3->mList[1].cluster.SetNonNull();
                    listHolder_3->mList[1].cluster.Value() = 1UL;
                    listHolder_3->mList[1].endpoint.SetNull();
                    listHolder_3->mList[1].deviceType.SetNull();

                    listHolder_3->mList[2].cluster.SetNonNull();
                    listHolder_3->mList[2].cluster.Value() = 2UL;
                    listHolder_3->mList[2].endpoint.SetNonNull();
                    listHolder_3->mList[2].endpoint.Value() = 3U;
                    listHolder_3->mList[2].deviceType.SetNull();

                    listHolder_0->mList[0].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              3);
                }
                listHolder_0->mList[0].fabricIndex = 0U;

                listHolder_0->mList[1].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(1);
                listHolder_0->mList[1].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(2);
                listHolder_0->mList[1].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(4);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 4ULL;
                    listHolder_3->mList[1]                  = 5ULL;
                    listHolder_3->mList[2]                  = 6ULL;
                    listHolder_3->mList[3]                  = 7ULL;
                    listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 4);
                }
                listHolder_0->mList[1].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(3);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNull();
                    listHolder_3->mList[0].endpoint.SetNonNull();
                    listHolder_3->mList[0].endpoint.Value() = 8U;
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_3->mList[1].cluster.SetNonNull();
                    listHolder_3->mList[1].cluster.Value() = 9UL;
                    listHolder_3->mList[1].endpoint.SetNull();
                    listHolder_3->mList[1].deviceType.SetNull();

                    listHolder_3->mList[2].cluster.SetNonNull();
                    listHolder_3->mList[2].cluster.Value() = 10UL;
                    listHolder_3->mList[2].endpoint.SetNonNull();
                    listHolder_3->mList[2].endpoint.Value() = 11U;
                    listHolder_3->mList[2].deviceType.SetNull();

                    listHolder_0->mList[1].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              3);
                }
                listHolder_0->mList[1].fabricIndex = 0U;

                listHolder_0->mList[2].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(3);
                listHolder_0->mList[2].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(3);
                listHolder_0->mList[2].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(4);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 12ULL;
                    listHolder_3->mList[1]                  = 13ULL;
                    listHolder_3->mList[2]                  = 14ULL;
                    listHolder_3->mList[3]                  = 15ULL;
                    listHolder_0->mList[2].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 4);
                }
                listHolder_0->mList[2].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(3);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNull();
                    listHolder_3->mList[0].endpoint.SetNonNull();
                    listHolder_3->mList[0].endpoint.Value() = 16U;
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_3->mList[1].cluster.SetNonNull();
                    listHolder_3->mList[1].cluster.Value() = 17UL;
                    listHolder_3->mList[1].endpoint.SetNull();
                    listHolder_3->mList[1].deviceType.SetNull();

                    listHolder_3->mList[2].cluster.SetNonNull();
                    listHolder_3->mList[2].cluster.Value() = 18UL;
                    listHolder_3->mList[2].endpoint.SetNonNull();
                    listHolder_3->mList[2].endpoint.Value() = 19U;
                    listHolder_3->mList[2].deviceType.SetNull();

                    listHolder_0->mList[2].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              3);
                }
                listHolder_0->mList[2].fabricIndex = 0U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(
                    listHolder_0->mList, 3);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Verify");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Write entries empty lists");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(5);
                listHolder_0->mList[0].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(2);
                listHolder_0->mList[0].subjects.SetNull();
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 0U;

                listHolder_0->mList[1].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(1);
                listHolder_0->mList[1].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(2);
                listHolder_0->mList[1].subjects.SetNonNull();

                listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>();
                listHolder_0->mList[1].targets.SetNonNull();

                listHolder_0->mList[1].targets.Value() =
                    chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>();
                listHolder_0->mList[1].fabricIndex = 0U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Verify");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Write entry invalid privilege");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(5);
                listHolder_0->mList[0].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(2);
                listHolder_0->mList[0].subjects.SetNull();
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 0U;

                listHolder_0->mList[1].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(5);
                listHolder_0->mList[1].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(3);
                listHolder_0->mList[1].subjects.SetNull();
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = 0U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Verify");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Write entry invalid auth mode");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(5);
                listHolder_0->mList[0].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(2);
                listHolder_0->mList[0].subjects.SetNull();
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 0U;

                listHolder_0->mList[1].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(1);
                listHolder_0->mList[1].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(1);
                listHolder_0->mList[1].subjects.SetNull();
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = 0U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Verify");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, true,
                                 chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Write entry invalid subject");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(5);
                listHolder_0->mList[0].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(2);
                listHolder_0->mList[0].subjects.SetNull();
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 0U;

                listHolder_0->mList[1].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(1);
                listHolder_0->mList[1].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(2);
                listHolder_0->mList[1].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 0ULL;
                    listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = 0U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Verify");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Write entry invalid target");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(5);
                listHolder_0->mList[0].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(2);
                listHolder_0->mList[0].subjects.SetNull();
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 0U;

                listHolder_0->mList[1].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(1);
                listHolder_0->mList[1].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(2);
                listHolder_0->mList[1].subjects.SetNull();
                listHolder_0->mList[1].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(1);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNull();
                    listHolder_3->mList[0].endpoint.SetNull();
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_0->mList[1].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              1);
                }
                listHolder_0->mList[1].fabricIndex = 0U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Verify");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, true,
                                 chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Write entry too many subjects");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(5);
                listHolder_0->mList[0].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(2);
                listHolder_0->mList[0].subjects.SetNull();
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 0U;

                listHolder_0->mList[1].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(1);
                listHolder_0->mList[1].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(2);
                listHolder_0->mList[1].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(20);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 1ULL;
                    listHolder_3->mList[1]                  = 2ULL;
                    listHolder_3->mList[2]                  = 3ULL;
                    listHolder_3->mList[3]                  = 4ULL;
                    listHolder_3->mList[4]                  = 5ULL;
                    listHolder_3->mList[5]                  = 6ULL;
                    listHolder_3->mList[6]                  = 7ULL;
                    listHolder_3->mList[7]                  = 8ULL;
                    listHolder_3->mList[8]                  = 9ULL;
                    listHolder_3->mList[9]                  = 10ULL;
                    listHolder_3->mList[10]                 = 11ULL;
                    listHolder_3->mList[11]                 = 12ULL;
                    listHolder_3->mList[12]                 = 13ULL;
                    listHolder_3->mList[13]                 = 14ULL;
                    listHolder_3->mList[14]                 = 15ULL;
                    listHolder_3->mList[15]                 = 16ULL;
                    listHolder_3->mList[16]                 = 17ULL;
                    listHolder_3->mList[17]                 = 18ULL;
                    listHolder_3->mList[18]                 = 19ULL;
                    listHolder_3->mList[19]                 = 20ULL;
                    listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 20);
                }
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = 0U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Verify");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, true,
                                 chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Write entry too many targets");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(5);
                listHolder_0->mList[0].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(2);
                listHolder_0->mList[0].subjects.SetNull();
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 0U;

                listHolder_0->mList[1].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(1);
                listHolder_0->mList[1].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(2);
                listHolder_0->mList[1].subjects.SetNull();
                listHolder_0->mList[1].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(20);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNull();
                    listHolder_3->mList[0].endpoint.SetNonNull();
                    listHolder_3->mList[0].endpoint.Value() = 1U;
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_3->mList[1].cluster.SetNull();
                    listHolder_3->mList[1].endpoint.SetNonNull();
                    listHolder_3->mList[1].endpoint.Value() = 2U;
                    listHolder_3->mList[1].deviceType.SetNull();

                    listHolder_3->mList[2].cluster.SetNull();
                    listHolder_3->mList[2].endpoint.SetNonNull();
                    listHolder_3->mList[2].endpoint.Value() = 3U;
                    listHolder_3->mList[2].deviceType.SetNull();

                    listHolder_3->mList[3].cluster.SetNull();
                    listHolder_3->mList[3].endpoint.SetNonNull();
                    listHolder_3->mList[3].endpoint.Value() = 4U;
                    listHolder_3->mList[3].deviceType.SetNull();

                    listHolder_3->mList[4].cluster.SetNull();
                    listHolder_3->mList[4].endpoint.SetNonNull();
                    listHolder_3->mList[4].endpoint.Value() = 5U;
                    listHolder_3->mList[4].deviceType.SetNull();

                    listHolder_3->mList[5].cluster.SetNull();
                    listHolder_3->mList[5].endpoint.SetNonNull();
                    listHolder_3->mList[5].endpoint.Value() = 6U;
                    listHolder_3->mList[5].deviceType.SetNull();

                    listHolder_3->mList[6].cluster.SetNull();
                    listHolder_3->mList[6].endpoint.SetNonNull();
                    listHolder_3->mList[6].endpoint.Value() = 7U;
                    listHolder_3->mList[6].deviceType.SetNull();

                    listHolder_3->mList[7].cluster.SetNull();
                    listHolder_3->mList[7].endpoint.SetNonNull();
                    listHolder_3->mList[7].endpoint.Value() = 8U;
                    listHolder_3->mList[7].deviceType.SetNull();

                    listHolder_3->mList[8].cluster.SetNull();
                    listHolder_3->mList[8].endpoint.SetNonNull();
                    listHolder_3->mList[8].endpoint.Value() = 9U;
                    listHolder_3->mList[8].deviceType.SetNull();

                    listHolder_3->mList[9].cluster.SetNull();
                    listHolder_3->mList[9].endpoint.SetNonNull();
                    listHolder_3->mList[9].endpoint.Value() = 10U;
                    listHolder_3->mList[9].deviceType.SetNull();

                    listHolder_3->mList[10].cluster.SetNull();
                    listHolder_3->mList[10].endpoint.SetNonNull();
                    listHolder_3->mList[10].endpoint.Value() = 11U;
                    listHolder_3->mList[10].deviceType.SetNull();

                    listHolder_3->mList[11].cluster.SetNull();
                    listHolder_3->mList[11].endpoint.SetNonNull();
                    listHolder_3->mList[11].endpoint.Value() = 12U;
                    listHolder_3->mList[11].deviceType.SetNull();

                    listHolder_3->mList[12].cluster.SetNull();
                    listHolder_3->mList[12].endpoint.SetNonNull();
                    listHolder_3->mList[12].endpoint.Value() = 13U;
                    listHolder_3->mList[12].deviceType.SetNull();

                    listHolder_3->mList[13].cluster.SetNull();
                    listHolder_3->mList[13].endpoint.SetNonNull();
                    listHolder_3->mList[13].endpoint.Value() = 14U;
                    listHolder_3->mList[13].deviceType.SetNull();

                    listHolder_3->mList[14].cluster.SetNull();
                    listHolder_3->mList[14].endpoint.SetNonNull();
                    listHolder_3->mList[14].endpoint.Value() = 15U;
                    listHolder_3->mList[14].deviceType.SetNull();

                    listHolder_3->mList[15].cluster.SetNull();
                    listHolder_3->mList[15].endpoint.SetNonNull();
                    listHolder_3->mList[15].endpoint.Value() = 16U;
                    listHolder_3->mList[15].deviceType.SetNull();

                    listHolder_3->mList[16].cluster.SetNull();
                    listHolder_3->mList[16].endpoint.SetNonNull();
                    listHolder_3->mList[16].endpoint.Value() = 17U;
                    listHolder_3->mList[16].deviceType.SetNull();

                    listHolder_3->mList[17].cluster.SetNull();
                    listHolder_3->mList[17].endpoint.SetNonNull();
                    listHolder_3->mList[17].endpoint.Value() = 18U;
                    listHolder_3->mList[17].deviceType.SetNull();

                    listHolder_3->mList[18].cluster.SetNull();
                    listHolder_3->mList[18].endpoint.SetNonNull();
                    listHolder_3->mList[18].endpoint.Value() = 19U;
                    listHolder_3->mList[18].deviceType.SetNull();

                    listHolder_3->mList[19].cluster.SetNull();
                    listHolder_3->mList[19].endpoint.SetNonNull();
                    listHolder_3->mList[19].endpoint.Value() = 20U;
                    listHolder_3->mList[19].deviceType.SetNull();

                    listHolder_0->mList[1].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              20);
                }
                listHolder_0->mList[1].fabricIndex = 0U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Verify");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, true,
                                 chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Write too many entries");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(4);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(5);
                listHolder_0->mList[0].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(2);
                listHolder_0->mList[0].subjects.SetNull();
                listHolder_0->mList[0].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(3);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNull();
                    listHolder_3->mList[0].endpoint.SetNonNull();
                    listHolder_3->mList[0].endpoint.Value() = 0U;
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_3->mList[1].cluster.SetNonNull();
                    listHolder_3->mList[1].cluster.Value() = 1UL;
                    listHolder_3->mList[1].endpoint.SetNull();
                    listHolder_3->mList[1].deviceType.SetNull();

                    listHolder_3->mList[2].cluster.SetNonNull();
                    listHolder_3->mList[2].cluster.Value() = 2UL;
                    listHolder_3->mList[2].endpoint.SetNonNull();
                    listHolder_3->mList[2].endpoint.Value() = 3U;
                    listHolder_3->mList[2].deviceType.SetNull();

                    listHolder_0->mList[0].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              3);
                }
                listHolder_0->mList[0].fabricIndex = 0U;

                listHolder_0->mList[1].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(1);
                listHolder_0->mList[1].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(2);
                listHolder_0->mList[1].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(4);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 4ULL;
                    listHolder_3->mList[1]                  = 5ULL;
                    listHolder_3->mList[2]                  = 6ULL;
                    listHolder_3->mList[3]                  = 7ULL;
                    listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 4);
                }
                listHolder_0->mList[1].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(3);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNull();
                    listHolder_3->mList[0].endpoint.SetNonNull();
                    listHolder_3->mList[0].endpoint.Value() = 8U;
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_3->mList[1].cluster.SetNonNull();
                    listHolder_3->mList[1].cluster.Value() = 9UL;
                    listHolder_3->mList[1].endpoint.SetNull();
                    listHolder_3->mList[1].deviceType.SetNull();

                    listHolder_3->mList[2].cluster.SetNonNull();
                    listHolder_3->mList[2].cluster.Value() = 10UL;
                    listHolder_3->mList[2].endpoint.SetNonNull();
                    listHolder_3->mList[2].endpoint.Value() = 11U;
                    listHolder_3->mList[2].deviceType.SetNull();

                    listHolder_0->mList[1].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              3);
                }
                listHolder_0->mList[1].fabricIndex = 0U;

                listHolder_0->mList[2].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(3);
                listHolder_0->mList[2].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(3);
                listHolder_0->mList[2].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(4);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 12ULL;
                    listHolder_3->mList[1]                  = 13ULL;
                    listHolder_3->mList[2]                  = 14ULL;
                    listHolder_3->mList[3]                  = 15ULL;
                    listHolder_0->mList[2].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 4);
                }
                listHolder_0->mList[2].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(3);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNull();
                    listHolder_3->mList[0].endpoint.SetNonNull();
                    listHolder_3->mList[0].endpoint.Value() = 16U;
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_3->mList[1].cluster.SetNonNull();
                    listHolder_3->mList[1].cluster.Value() = 17UL;
                    listHolder_3->mList[1].endpoint.SetNull();
                    listHolder_3->mList[1].deviceType.SetNull();

                    listHolder_3->mList[2].cluster.SetNonNull();
                    listHolder_3->mList[2].cluster.Value() = 18UL;
                    listHolder_3->mList[2].endpoint.SetNonNull();
                    listHolder_3->mList[2].endpoint.Value() = 19U;
                    listHolder_3->mList[2].deviceType.SetNull();

                    listHolder_0->mList[2].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              3);
                }
                listHolder_0->mList[2].fabricIndex = 0U;

                listHolder_0->mList[3].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(1);
                listHolder_0->mList[3].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(2);
                listHolder_0->mList[3].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(4);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 20ULL;
                    listHolder_3->mList[1]                  = 21ULL;
                    listHolder_3->mList[2]                  = 22ULL;
                    listHolder_3->mList[3]                  = 23ULL;
                    listHolder_0->mList[3].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 4);
                }
                listHolder_0->mList[3].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(3);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNull();
                    listHolder_3->mList[0].endpoint.SetNonNull();
                    listHolder_3->mList[0].endpoint.Value() = 24U;
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_3->mList[1].cluster.SetNonNull();
                    listHolder_3->mList[1].cluster.Value() = 25UL;
                    listHolder_3->mList[1].endpoint.SetNull();
                    listHolder_3->mList[1].deviceType.SetNull();

                    listHolder_3->mList[2].cluster.SetNonNull();
                    listHolder_3->mList[2].cluster.Value() = 26UL;
                    listHolder_3->mList[2].endpoint.SetNonNull();
                    listHolder_3->mList[2].endpoint.Value() = 27U;
                    listHolder_3->mList[2].deviceType.SetNull();

                    listHolder_0->mList[3].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              3);
                }
                listHolder_0->mList[3].fabricIndex = 0U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(
                    listHolder_0->mList, 4);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Verify");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, true,
                                 chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Restore ACL");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(5);
                listHolder_0->mList[0].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(2);
                listHolder_0->mList[0].subjects.SetNull();
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 0U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(
                    listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Verify");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, true,
                                 chip::NullOptional);
        }
        case 21: {
            LogStep(21, "Validate resource minima (SubjectsPerAccessControlEntry)");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id,
                                 AccessControl::Attributes::SubjectsPerAccessControlEntry::Id, true, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Validate resource minima (TargetsPerAccessControlEntry)");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id,
                                 AccessControl::Attributes::TargetsPerAccessControlEntry::Id, true, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "Validate resource minima (AccessControlEntriesPerFabric)");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id,
                                 AccessControl::Attributes::AccessControlEntriesPerFabric::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ACL_1_1Suite : public TestCommand
{
public:
    Test_TC_ACL_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ACL_1_1", 7, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ACL_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH reads ClusterRevision attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::ClusterRevision::Id,
                                 true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads FeatureMap attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH reads AttributeList attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads optional attribute (Extension) in AttributeList");
            VerifyOrDo(!ShouldSkip("ACL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads AcceptedCommandList attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id,
                                 AccessControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH reads GeneratedCommandList attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id,
                                 AccessControl::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ACL_2_1Suite : public TestCommand
{
public:
    Test_TC_ACL_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ACL_2_1", 4, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ACL_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 4U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 3U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 3U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH reads SubjectsPerAccessControlEntry attribute from DUT");
            VerifyOrDo(!ShouldSkip("ACL.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id,
                                 AccessControl::Attributes::SubjectsPerAccessControlEntry::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads TargetsPerAccessControlEntry attribute from DUT");
            VerifyOrDo(!ShouldSkip("ACL.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id,
                                 AccessControl::Attributes::TargetsPerAccessControlEntry::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH reads AccessControlEntriesPerFabric attribute from DUT");
            VerifyOrDo(!ShouldSkip("ACL.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id,
                                 AccessControl::Attributes::AccessControlEntriesPerFabric::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ACL_2_2Suite : public TestCommand
{
public:
    Test_TC_ACL_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ACL_2_2", 3, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ACL_2_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::ClusterId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 31UL));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH1 reads DUT Descriptor cluster ServerList attribute from Endpoint 0");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Descriptor::Id, Descriptor::Attributes::ServerList::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH1 reads DUT Descriptor cluster ServerList attribute from every Endpoint except 0");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Factory Reset the DUT and enter 'y' after successgarbage: not in length on purpose", 49);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BOOL_1_1Suite : public TestCommand
{
public:
    Test_TC_BOOL_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BOOL_1_1", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BOOL_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), BooleanState::Id, BooleanState::Attributes::ClusterRevision::Id,
                                 true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), BooleanState::Id, BooleanState::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), BooleanState::Id, BooleanState::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), BooleanState::Id,
                                 BooleanState::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), BooleanState::Id,
                                 BooleanState::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BOOL_2_1Suite : public TestCommand
{
public:
    Test_TC_BOOL_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BOOL_2_1", 2, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BOOL_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "boolean", "boolean"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read mandatory non-global attribute: StateValue");
            VerifyOrDo(!ShouldSkip("BOOL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), BooleanState::Id, BooleanState::Attributes::StateValue::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ACT_1_1Suite : public TestCommand
{
public:
    Test_TC_ACT_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ACT_1_1", 7, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ACT_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 11));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Actions::Id, Actions::Attributes::ClusterRevision::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Actions::Id, Actions::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Actions::Id, Actions::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the optional attribute(SetupURL) in AttributeList");
            VerifyOrDo(!ShouldSkip("ACT.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Actions::Id, Actions::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Actions::Id, Actions::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Actions::Id, Actions::Attributes::GeneratedCommandList::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BIND_1_1Suite : public TestCommand
{
public:
    Test_TC_BIND_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BIND_1_1", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BIND_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH reads the ClusterRevision from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Binding::Id, Binding::Attributes::ClusterRevision::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads the FeatureMap from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Binding::Id, Binding::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH reads AttributeList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Binding::Id, Binding::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads AcceptedCommandList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Binding::Id, Binding::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads GeneratedCommandList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Binding::Id, Binding::Attributes::GeneratedCommandList::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_1_1Suite : public TestCommand
{
public:
    Test_TC_CC_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_1_1", 47, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 5U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 2UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 4UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 8UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 16UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 8UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 15UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 16385UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 16394UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 6UL));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 7UL));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 16384UL));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 16386UL));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 16387UL));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 16388UL));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 16389UL));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 16390UL));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 16395UL));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 16396UL));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 16397UL));
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 16400UL));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
            }
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
            }
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
            }
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 6UL));
            }
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 7UL));
            }
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 8UL));
            }
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 9UL));
            }
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 10UL));
            }
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 64UL));
            }
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 65UL));
            }
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 66UL));
            }
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 67UL));
            }
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 68UL));
            }
            break;
        case 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 71UL));
            }
            break;
        case 44:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 75UL));
            }
            break;
        case 45:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 76UL));
            }
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ClusterRevision::Id,
                                 true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            VerifyOrDo(!ShouldSkip("( !CC.S.F00 && !CC.S.F01 && !CC.S.F02 && !CC.S.F03 && !CC.S.F04 )"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Given CC.S.F00(HS) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Given CC.S.F01(EHue) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Given CC.S.F02(CL) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("CC.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Given CC.S.F03(XY) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("CC.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Given CC.S.F04(CT) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("CC.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Read the optional attribute(CurrentHue) in AttributeList");
            VerifyOrDo(!ShouldSkip("CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Read the optional attribute(CurrentSaturation) in AttributeList");
            VerifyOrDo(!ShouldSkip("CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Read the optional attribute(RemainingTime) in AttributeList");
            VerifyOrDo(!ShouldSkip("CC.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Read the optional attribute(CurrentX) in AttributeList");
            VerifyOrDo(!ShouldSkip("CC.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Read the optional attribute(CurrentY) in AttributeList");
            VerifyOrDo(!ShouldSkip("CC.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Read the optional attribute(DriftCompensation) in AttributeList");
            VerifyOrDo(!ShouldSkip("CC.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Read the optional attribute(CompensationText) in AttributeList");
            VerifyOrDo(!ShouldSkip("CC.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Read the optional attribute(ColorTemperatureMireds) in AttributeList");
            VerifyOrDo(!ShouldSkip("CC.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Read the optional attribute(EnhancedCurrentHue) in AttributeList");
            VerifyOrDo(!ShouldSkip("CC.S.A4000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Read the optional attribute(ColorLoopActive) in AttributeList");
            VerifyOrDo(!ShouldSkip("CC.S.A4002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Read the optional attribute(ColorLoopDirection) in AttributeList");
            VerifyOrDo(!ShouldSkip("CC.S.A4003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Read the optional attribute(ColorLoopTime) in AttributeList");
            VerifyOrDo(!ShouldSkip("CC.S.A4004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "Read the optional attribute(ColorLoopStartEnhancedHue) in AttributeList");
            VerifyOrDo(!ShouldSkip("CC.S.A4005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Read the optional attribute(ColorLoopStoredEnhancedHue) in AttributeList");
            VerifyOrDo(!ShouldSkip("CC.S.A4006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "Read the optional attribute(ColorTempPhysicalMinMireds) in AttributeList");
            VerifyOrDo(!ShouldSkip("CC.S.A400b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 24: {
            LogStep(24, "Read the optional attribute(ColorTempPhysicalMaxMireds) in AttributeList");
            VerifyOrDo(!ShouldSkip("CC.S.A400c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 25: {
            LogStep(25, "Read the optional attribute(CoupleColorTempToLevelMinMireds) in AttributeList");
            VerifyOrDo(!ShouldSkip("CC.S.A400d"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 26: {
            LogStep(26, "Read the optional attribute(StartUpColorTemperatureMireds) in AttributeList");
            VerifyOrDo(!ShouldSkip("CC.S.A4010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 27: {
            LogStep(27, "Read the optional command(MoveToHue) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("CC.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 28: {
            LogStep(28, "Read the optional command(MoveHue) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("CC.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 29: {
            LogStep(29, "Read the optional command(StepHue) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("CC.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 30: {
            LogStep(30, "Read the optional command(MoveToSaturation) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("CC.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 31: {
            LogStep(31, "Read the optional command(MoveSaturation) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("CC.S.C04.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 32: {
            LogStep(32, "Read the optional command(StepSaturation) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("CC.S.C05.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 33: {
            LogStep(33, "Read the optional command(MoveToHueAndSaturation) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("CC.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 34: {
            LogStep(34, "Read the optional command(MoveToColor) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 35: {
            LogStep(35, "Read the optional command(MoveColor) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("CC.S.C08.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 36: {
            LogStep(36, "Read the optional command(StepColor) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("CC.S.C09.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 37: {
            LogStep(37, "Read the optional command(MoveToColorTemperature) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("CC.S.C0a.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 38: {
            LogStep(38, "Read the optional command(EnhancedMoveToHue) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 39: {
            LogStep(39, "Read the optional command(EnhancedMoveHue) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("CC.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 40: {
            LogStep(40, "Read the optional command(EnhancedStepHue) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("CC.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 41: {
            LogStep(41, "Read the optional command(EnhancedMoveToHueAndSaturation) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("CC.S.C43.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 42: {
            LogStep(42, "Read the optional command(ColorLoopSet) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 43: {
            LogStep(43, "Read the optional command(StopMoveStep) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("CC.S.C47.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 44: {
            LogStep(44, "Read the optional command(MoveColorTemperature) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("CC.S.C4b.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 45: {
            LogStep(45, "Read the optional command(StepColorTemperature) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("CC.S.C4c.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 46: {
            LogStep(46, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_2_1Suite : public TestCommand
{
public:
    Test_TC_CC_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_2_1", 54, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    uint32_t FeatureMapValue;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65534U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 254));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65534U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                FeatureMapValue = value;
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorCapabilities", value, FeatureMapValue));
                VerifyOrReturn(CheckConstraintType("value", "bitmap16", "bitmap16"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 31U));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 6U));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
            }
            break;
        case 44:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
            }
            break;
        case 45:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
            }
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
            }
            break;
        case 47:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 48:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
            }
            break;
        case 49:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
            }
            break;
        case 50:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 51:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
            }
            break;
        case 52:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
            }
            break;
        case 53:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH reads RemainingTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::RemainingTime::Id,
                                 true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads CurrentX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentX::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads CurrentY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentY::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH reads DriftCompensation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::DriftCompensation::Id,
                                 true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH reads CompensationText attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CompensationText::Id,
                                 true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH reads ColorTemperatureMireds attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "TH reads ColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorMode::Id, true,
                                 chip::NullOptional);
        }
        case 10: {
            LogStep(10, "TH reads Options attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A4000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "TH reads EnhancedColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedColorMode::Id,
                                 true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "TH reads ColorLoopActive attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A4002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id,
                                 true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "TH reads ColorLoopDirection attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A4003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopDirection::Id,
                                 true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "TH reads ColorLoopTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A4004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopTime::Id,
                                 true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "TH reads ColorLoopStartEnhancedHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A4005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStartEnhancedHue::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "TH reads ColorLoopStoredEnhancedHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A4006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStoredEnhancedHue::Id, true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Saving for comparision in step 19 reads FeatureMap attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 19: {
            LogStep(19, "TH reads ColorCapabilities attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A400a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorCapabilities::Id,
                                 true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "TH reads ColorTempPhysicalMinMireds attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A400b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTempPhysicalMinMireds::Id, true, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "TH reads ColorTempPhysicalMaxMireds attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A400c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTempPhysicalMaxMireds::Id, true, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "TH reads CoupleColorTempToLevelMinMireds attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A400d"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::CoupleColorTempToLevelMinMireds::Id, true, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "TH reads StartUpColorTemperatureMireds attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A4010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::StartUpColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 24: {
            LogStep(24, "TH reads NumberOfPrimaries attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::NumberOfPrimaries::Id,
                                 true, chip::NullOptional);
        }
        case 25: {
            LogStep(25,
                    "TH reads Primary1X attribute from DUT and Verify that the DUT response contains an uint16 [Min:0 Max:0xfeff] "
                    "if NumberOfPrimaries is 1 or more");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && CC.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 26: {
            LogStep(26,
                    "TH reads Primary1Y attribute from DUT and Verify that the DUT response contains an uint16 [Min:0 Max:0xfeff] "
                    "if NumberOfPrimaries is 1 or more");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && CC.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 27: {
            LogStep(27,
                    "TH reads Primary1Intensity attribute from DUT and Verify that the DUT response contains an uint8 if "
                    "NumberOfPrimaries is 1 or more");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && CC.S.A0013"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 28: {
            LogStep(28,
                    "TH reads Primary2X attribute from DUT and Verify that the DUT response contains an uint16 [Min:0 Max:0xfeff] "
                    "if NumberOfPrimaries is 2 or more");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && CC.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 29: {
            LogStep(29,
                    "TH reads Primary2Y attribute from DUT and Verify that the DUT response contains an uint16 [Min:0 Max:0xfeff] "
                    "if NumberOfPrimaries is 2 or more");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && CC.S.A0016"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 30: {
            LogStep(30,
                    "TH reads Primary2Intensity attribute from DUT and Verify that the DUT response contains an uint8 if "
                    "NumberOfPrimaries is 2 or more");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && CC.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 31: {
            LogStep(31,
                    "TH reads Primary3X attribute from DUT and Verify that the DUT response contains an uint16 [Min:0 Max:0xfeff] "
                    "if NumberOfPrimaries is 3 or more");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && CC.S.A0019"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 32: {
            LogStep(32,
                    "TH reads Primary3Y attribute from DUT and Verify that the DUT response contains an uint16 [Min:0 Max:0xfeff] "
                    "if NumberOfPrimaries is 3 or more");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && CC.S.A001a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 33: {
            LogStep(33,
                    "TH reads Primary3Intensity attribute from DUT and Verify that the DUT response contains an uint8 if "
                    "NumberOfPrimaries is 3 or more");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && CC.S.A001b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 34: {
            LogStep(34,
                    "TH reads Primary4X attribute from DUT Verify that the DUT response contains an uint16 [Min:0 Max:0xfeff] if "
                    "NumberOfPrimaries is 4 or more");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && CC.S.A0020"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 35: {
            LogStep(35,
                    "TH reads Primary4Y attribute from DUT and Verify that the DUT response contains an uint16 [Min:0 Max:0xfeff] "
                    "if NumberOfPrimaries is 4 or more");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && CC.S.A0021"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 36: {
            LogStep(36,
                    "TH reads Primary4Intensity attribute from DUT and Verify that the DUT response contains an uint8 if "
                    "NumberOfPrimaries is 4 or more");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && CC.S.A0022"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 37: {
            LogStep(37,
                    "TH reads Primary5X attribute from DUT and Verify that the DUT response contains an uint16 [Min:0 Max:0xfeff] "
                    "if NumberOfPrimaries is 5 or more");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && CC.S.A0024"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 38: {
            LogStep(38,
                    "TH reads Primary5Y attribute from DUT and Verify that the DUT response contains an uint16 [Min:0 Max:0xfeff] "
                    "if NumberOfPrimaries is 5 or more");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && CC.S.A0025"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 39: {
            LogStep(39,
                    "TH reads Primary5Intensity attribute from DUT and Verify that the DUT response contains an uint8 if "
                    "NumberOfPrimaries is 5 or more");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && CC.S.A0026"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 40: {
            LogStep(40,
                    "TH reads Primary6X attribute from DUT and Verify that the DUT response contains an uint16 [Min:0 Max:0xfeff] "
                    "if NumberOfPrimaries is 6 or more");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && CC.S.A0028"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 41: {
            LogStep(41,
                    "TH reads Primary6Y attribute from DUT and Verify that the DUT response contains an uint16 [Min:0 Max:0xfeff] "
                    "if NumberOfPrimaries is 6 or more");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && CC.S.A0029"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 42: {
            LogStep(42,
                    "TH reads Primary6Intensity attribute from DUT and Verify that the DUT response contains an uint8 if "
                    "NumberOfPrimaries is 6 or more");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && CC.S.A002a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 43: {
            LogStep(43, "TH reads WhitePointX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A0030"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::WhitePointX::Id, true,
                                 chip::NullOptional);
        }
        case 44: {
            LogStep(44, "TH reads WhitePointY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A0031"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::WhitePointY::Id, true,
                                 chip::NullOptional);
        }
        case 45: {
            LogStep(45, "TH reads ColorPointRX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A0032"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorPointRX::Id, true,
                                 chip::NullOptional);
        }
        case 46: {
            LogStep(46, "TH reads ColorPointRY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A0033"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorPointRY::Id, true,
                                 chip::NullOptional);
        }
        case 47: {
            LogStep(47, "TH reads ColorPointRIntensity attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A0034"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorPointRIntensity::Id, true, chip::NullOptional);
        }
        case 48: {
            LogStep(48, "TH reads ColorPointGX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A0036"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorPointGX::Id, true,
                                 chip::NullOptional);
        }
        case 49: {
            LogStep(49, "TH reads ColorPointGY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A0037"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorPointGY::Id, true,
                                 chip::NullOptional);
        }
        case 50: {
            LogStep(50, "TH reads ColorPointGIntensity attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A0038"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorPointGIntensity::Id, true, chip::NullOptional);
        }
        case 51: {
            LogStep(51, "TH reads ColorPointBX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A003a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorPointBX::Id, true,
                                 chip::NullOptional);
        }
        case 52: {
            LogStep(52, "TH reads ColorPointBY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A003b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorPointBY::Id, true,
                                 chip::NullOptional);
        }
        case 53: {
            LogStep(53, "TH reads ColorPointBIntensity attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A003c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorPointBIntensity::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_3_2Suite : public TestCommand
{
public:
    Test_TC_CC_3_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_3_2", 31, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_3_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 215U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 38U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 52U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 80U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 110U));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 80U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 110U));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 8U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 12U));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 183U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 247U));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 140U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 190U));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 140U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 190U));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorMode", value, 0U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedColorMode", value, 0U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3,
                    "TH sends MoveToHue command to DUT with Hue=200, Direction=0x00 (shortest distance) and TransitionTime=0 "
                    "(immediately)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToHue::Type value;
            value.hue             = 200U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToHue::Id, value,
                               chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "TH sends MoveHue command to DUT with MoveMode=0x01 (up) and Rate=5 (units/s)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveHue::Type value;
            value.moveMode        = static_cast<chip::app::Clusters::ColorControl::HueMoveMode>(1);
            value.rate            = 5U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveHue::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 11: {
            LogStep(11, "TH sends MoveHue command to DUT with MoveMode=0x00 (stop) and Rate=5 (units/s)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveHue::Type value;
            value.moveMode        = static_cast<chip::app::Clusters::ColorControl::HueMoveMode>(0);
            value.rate            = 5U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveHue::Id, value,
                               chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Wait 2s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 2000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 15: {
            LogStep(15,
                    "TH sends MoveToHue command to DUT with Hue=60, Direction=0x00 (shortest distance) and TransitionTime=0 "
                    "(immediately)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToHue::Type value;
            value.hue             = 60U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToHue::Id, value,
                               chip::NullOptional

            );
        }
        case 16: {
            LogStep(16, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17, "TH sends MoveHue command to DUT with MoveMode=0x03 (down) and Rate=5 (units/s)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveHue::Type value;
            value.moveMode        = static_cast<chip::app::Clusters::ColorControl::HueMoveMode>(3);
            value.rate            = 5U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveHue::Id, value,
                               chip::NullOptional

            );
        }
        case 18: {
            LogStep(18, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 19: {
            LogStep(19, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 21: {
            LogStep(21, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 23: {
            LogStep(23, "TH sends MoveHue command to DUT with MoveMode=0x00 (stop) and Rate=5 (units/s)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveHue::Type value;
            value.moveMode        = static_cast<chip::app::Clusters::ColorControl::HueMoveMode>(0);
            value.rate            = 5U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveHue::Id, value,
                               chip::NullOptional

            );
        }
        case 24: {
            LogStep(24, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 25: {
            LogStep(25, "Wait 2s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 2000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 26: {
            LogStep(26, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 27: {
            LogStep(27, "TH reads ColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorMode::Id, true,
                                 chip::NullOptional);
        }
        case 28: {
            LogStep(28, "TH reads EnhancedColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedColorMode::Id,
                                 true, chip::NullOptional);
        }
        case 29: {
            LogStep(29, "Turn off light that we turned on");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 30: {
            LogStep(30, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_3_3Suite : public TestCommand
{
public:
    Test_TC_CC_3_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_3_3", 25, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_3_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 195U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 4U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 6U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 4U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 6U));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 17U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 23U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 208U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 208U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorMode", value, 0U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedColorMode", value, 0U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3,
                    "TH sends MoveToHue command to DUT with Hue=200, Direction=0x00 (shortest distance) and TransitionTime=0 "
                    "(immediately)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToHue::Type value;
            value.hue             = 200U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToHue::Id, value,
                               chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "TH sends StepHue command to DUT with StepMode=0x01 (up), StepSize=60 and TransitionTime=200 (20s)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::StepHue::Type value;
            value.stepMode        = static_cast<chip::app::Clusters::ColorControl::HueStepMode>(1);
            value.stepSize        = 60U;
            value.transitionTime  = 200U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StepHue::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Wait 5s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 11: {
            LogStep(11, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 12: {
            LogStep(12,
                    "TH sends MoveToHue command to DUT with Hue=50, Direction=0x00 (shortest distance) and TransitionTime=0 "
                    "(immediately)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToHue::Type value;
            value.hue             = 50U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToHue::Id, value,
                               chip::NullOptional

            );
        }
        case 13: {
            LogStep(13, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14, "TH sends StepHue command to DUT with StepMode=0x03 (down), StepSize=60 and TransitionTime=200 (20s)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::StepHue::Type value;
            value.stepMode        = static_cast<chip::app::Clusters::ColorControl::HueStepMode>(3);
            value.stepSize        = 60U;
            value.transitionTime  = 200U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StepHue::Id, value,
                               chip::NullOptional

            );
        }
        case 15: {
            LogStep(15, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 16: {
            LogStep(16, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 18: {
            LogStep(18, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Wait 5s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 20: {
            LogStep(20, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 21: {
            LogStep(21, "TH reads ColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorMode::Id, true,
                                 chip::NullOptional);
        }
        case 22: {
            LogStep(22, "TH reads EnhancedColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedColorMode::Id,
                                 true, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "Turn off light that we turned on");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 24: {
            LogStep(24, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_4_1Suite : public TestCommand
{
public:
    Test_TC_CC_4_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_4_1", 18, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("SaturationConfigValue", 0, UINT8_MAX, &mSaturationConfigValue);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_4_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint8_t> mSaturationConfigValue;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 68U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 92U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 80U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 115U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 102U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 138U));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 102U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 138U));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorMode", value, 0U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedColorMode", value, 0U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "TH sends MoveToSaturation command to DUT with Saturation=60 and TransitionTime=0 (immediately)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToSaturation::Type value;
            value.saturation      = 60U;
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToSaturation::Id,
                               value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "TH sends MoveToSaturation command to DUT with Saturation=120 and TransitionTime=300 (30s)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToSaturation::Type value;
            value.saturation      = 120U;
            value.transitionTime  = 300U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToSaturation::Id,
                               value, chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 11: {
            LogStep(11, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Wait 5s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "TH reads ColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorMode::Id, true,
                                 chip::NullOptional);
        }
        case 15: {
            LogStep(15, "TH reads EnhancedColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedColorMode::Id,
                                 true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Turn off light that we turned on");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 17: {
            LogStep(17, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_4_2Suite : public TestCommand
{
public:
    Test_TC_CC_4_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_4_2", 34, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_4_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 170U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 230U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 216U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 216U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 59U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 81U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 17U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 23U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 10U));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 170U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 230U));
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 170U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 230U));
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 170U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 230U));
            }
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorMode", value, 0U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedColorMode", value, 0U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "TH sends MoveToSaturation command to DUT with Saturation=150 and TransitionTime=0 (immediately)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToSaturation::Type value;
            value.saturation      = 150U;
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToSaturation::Id,
                               value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "TH sends MoveSaturation command to DUT with MoveMode=0x01 (up) and Rate=5 (units/s)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C04.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveSaturation::Type value;
            value.moveMode        = static_cast<chip::app::Clusters::ColorControl::SaturationMoveMode>(1);
            value.rate            = 5U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveSaturation::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Wait 5s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 11: {
            LogStep(11, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "TH sends MoveToSaturation command to DUT with Saturation=120 and TransitionTime=0 (immediately)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToSaturation::Type value;
            value.saturation      = 120U;
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToSaturation::Id,
                               value, chip::NullOptional

            );
        }
        case 13: {
            LogStep(13, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14, "TH sends MoveSaturation command to DUT with MoveMode=0x03 (down) and Rate=5 (units/s)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C04.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveSaturation::Type value;
            value.moveMode        = static_cast<chip::app::Clusters::ColorControl::SaturationMoveMode>(3);
            value.rate            = 5U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveSaturation::Id, value,
                               chip::NullOptional

            );
        }
        case 15: {
            LogStep(15, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 16: {
            LogStep(16, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 18: {
            LogStep(18, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 20: {
            LogStep(20, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "TH sends MoveToSaturation command to DUT with Saturation=150 and TransitionTime=0 (immediately)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToSaturation::Type value;
            value.saturation      = 150U;
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToSaturation::Id,
                               value, chip::NullOptional

            );
        }
        case 22: {
            LogStep(22, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 23: {
            LogStep(23, "TH sends MoveSaturation command to DUT with MoveMode=0x01 (up) and Rate=5 (units/s)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C04.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveSaturation::Type value;
            value.moveMode        = static_cast<chip::app::Clusters::ColorControl::SaturationMoveMode>(1);
            value.rate            = 5U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveSaturation::Id, value,
                               chip::NullOptional

            );
        }
        case 24: {
            LogStep(24, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 25: {
            LogStep(25, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 26: {
            LogStep(26, "TH sends MoveSaturation command to DUT with MoveMode=0x00 (stop) and Rate=5 (units/s)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C04.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveSaturation::Type value;
            value.moveMode        = static_cast<chip::app::Clusters::ColorControl::SaturationMoveMode>(0);
            value.rate            = 5U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveSaturation::Id, value,
                               chip::NullOptional

            );
        }
        case 27: {
            LogStep(27, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 28: {
            LogStep(28, "Wait 2s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 2000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 29: {
            LogStep(29, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 30: {
            LogStep(30, "TH reads ColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorMode::Id, true,
                                 chip::NullOptional);
        }
        case 31: {
            LogStep(31, "TH reads EnhancedColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedColorMode::Id,
                                 true, chip::NullOptional);
        }
        case 32: {
            LogStep(32, "Turn off light that we turned on");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 33: {
            LogStep(33, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_4_3Suite : public TestCommand
{
public:
    Test_TC_CC_4_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_4_3", 31, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_4_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 187U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 253U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 204U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 204U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 216U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 25U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 35U));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 8U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 12U));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 8U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 12U));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentSaturation", value, 0U));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorMode", value, 0U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedColorMode", value, 0U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "TH sends MoveToSaturation command to DUT with Saturation=200 and TransitionTime=0 (immediately)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToSaturation::Type value;
            value.saturation      = 200U;
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToSaturation::Id,
                               value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "TH sends StepSaturation command to DUT with StepMode=0x01 (up), StepSize=40 and TransitionTime=200 (20s)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C05.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::StepSaturation::Type value;
            value.stepMode        = static_cast<chip::app::Clusters::ColorControl::SaturationStepMode>(1);
            value.stepSize        = 40U;
            value.transitionTime  = 200U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StepSaturation::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Wait 5s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 11: {
            LogStep(11, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "TH sends StepSaturation command to DUT with StepMode=0x01 (up), StepSize=20 and TransitionTime=100 (10s)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C05.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::StepSaturation::Type value;
            value.stepMode        = static_cast<chip::app::Clusters::ColorControl::SaturationStepMode>(1);
            value.stepSize        = 20U;
            value.transitionTime  = 100U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StepSaturation::Id, value,
                               chip::NullOptional

            );
        }
        case 13: {
            LogStep(13, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "TH sends MoveToSaturation command to DUT with Saturation=50 and TransitionTime=0 (immediately)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToSaturation::Type value;
            value.saturation      = 50U;
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToSaturation::Id,
                               value, chip::NullOptional

            );
        }
        case 16: {
            LogStep(16, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17,
                    "TH sends StepSaturation command to DUT with StepMode=0x03 (down), StepSize=40 and TransitionTime=200 (20s)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C05.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::StepSaturation::Type value;
            value.stepMode        = static_cast<chip::app::Clusters::ColorControl::SaturationStepMode>(3);
            value.stepSize        = 40U;
            value.transitionTime  = 200U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StepSaturation::Id, value,
                               chip::NullOptional

            );
        }
        case 18: {
            LogStep(18, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 19: {
            LogStep(19, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 21: {
            LogStep(21, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Wait 5s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 23: {
            LogStep(23, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 24: {
            LogStep(24,
                    "TH sends StepSaturation command to DUT with StepMode=0x03 (down), StepSize=20 and TransitionTime=100 (10 s)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C05.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::StepSaturation::Type value;
            value.stepMode        = static_cast<chip::app::Clusters::ColorControl::SaturationStepMode>(3);
            value.stepSize        = 20U;
            value.transitionTime  = 100U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StepSaturation::Id, value,
                               chip::NullOptional

            );
        }
        case 25: {
            LogStep(25, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 26: {
            LogStep(26, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 27: {
            LogStep(27, "TH reads ColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorMode::Id, true,
                                 chip::NullOptional);
        }
        case 28: {
            LogStep(28, "TH reads EnhancedColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedColorMode::Id,
                                 true, chip::NullOptional);
        }
        case 29: {
            LogStep(29, "Turn off light that we turned on");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 30: {
            LogStep(30, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_4_4Suite : public TestCommand
{
public:
    Test_TC_CC_4_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_4_4", 21, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_4_4Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 170U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 230U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 42U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 58U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 160U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 200U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 50U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 80U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 135U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 185U));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 68U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 92U));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 135U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 185U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 68U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 92U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorMode", value, 0U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedColorMode", value, 0U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(
                3, "TH sends MoveToHueAndSaturation command to DUT with Hue=200, Saturation=50 and TransitionTime=0 (immediately)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToHueAndSaturation::Type value;
            value.hue             = 200U;
            value.saturation      = 50U;
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToHueAndSaturation::Id,
                               value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "TH reads CurrentHue attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000 && CC.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH sends MoveToHueAndSaturation command to DUT with Hue=160, Saturation=80 and TransitionTime=200 (20s)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToHueAndSaturation::Type value;
            value.hue             = 160U;
            value.saturation      = 80U;
            value.transitionTime  = 200U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToHueAndSaturation::Id,
                               value, chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 10: {
            LogStep(10, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 12: {
            LogStep(12, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 13: {
            LogStep(13, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Wait 5s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 15: {
            LogStep(15, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 16: {
            LogStep(16, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "TH reads ColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorMode::Id, true,
                                 chip::NullOptional);
        }
        case 18: {
            LogStep(18, "TH reads EnhancedColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedColorMode::Id,
                                 true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Turn off light that we turned on");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 20: {
            LogStep(20, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_5_1Suite : public TestCommand
{
public:
    Test_TC_CC_5_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_5_1", 59, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_5_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 27853U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 37683U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 16711U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 22609U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 13107U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32768U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 13107U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 19660U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 11141U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 15073U));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 11141U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 15073U));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 11141U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 15073U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 11141U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 15073U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("options", value, 0U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 27853U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 37683U));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 16711U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 22609U));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentX", value, 32768U));
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentY", value, 19660U));
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentX", value, 32768U));
            }
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentY", value, 19660U));
            }
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 22282U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 30146U));
            }
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 27853U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 37683U));
            }
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("options", value, 1U));
            }
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 27853U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 37683U));
            }
            break;
        case 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 16711U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 22609U));
            }
            break;
        case 44:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 45:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 47:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 11141U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 15073U));
            }
            break;
        case 48:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 11141U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 15073U));
            }
            break;
        case 49:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 50:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 51:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentX", value, 13107U));
            }
            break;
        case 52:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentY", value, 13107U));
            }
            break;
        case 53:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 54:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 55:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 22282U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 30146U));
            }
            break;
        case 56:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 27853U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 37683U));
            }
            break;
        case 57:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorMode", value, 1U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            break;
        case 58:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedColorMode", value, 1U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3,
                    "TH sends MoveToColor command to DUT, with ColorX = 32768/0x8000 ColorY = 19660/0x4CCC TransitionTime = 0 "
                    "(immediate)");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToColor::Type value;
            value.colorX          = 32768U;
            value.colorY          = 19660U;
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToColor::Id, value,
                               chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "TH reads CurrentX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentX::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH reads CurrentY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentY::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(
                7,
                "TH sends MoveToColor command to DUT, with ColorX = 13107/0x3333 ColorY = 13107/0x3333 TransitionTime = 200 (20s)");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToColor::Type value;
            value.colorX          = 13107U;
            value.colorY          = 13107U;
            value.transitionTime  = 200U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToColor::Id, value,
                               chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "TH reads CurrentX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentX::Id, true,
                                 chip::NullOptional);
        }
        case 10: {
            LogStep(10, "TH reads CurrentY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentY::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 12: {
            LogStep(12, "TH reads CurrentX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentX::Id, true,
                                 chip::NullOptional);
        }
        case 13: {
            LogStep(13, "TH reads CurrentY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentY::Id, true,
                                 chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Wait 5s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 15: {
            LogStep(15, "TH reads CurrentX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentX::Id, true,
                                 chip::NullOptional);
        }
        case 16: {
            LogStep(16, "TH reads CurrentY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentY::Id, true,
                                 chip::NullOptional);
        }
        case 17: {
            LogStep(17, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "TH read Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, true,
                                 chip::NullOptional);
        }
        case 19: {
            LogStep(19, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 20: {
            LogStep(20,
                    "TH sends a MoveToColor command to the DUT with ColorX = 32768/0x8000 (x=0.5) (purple) ColorY = 19660/0x4CCC "
                    "(y=0.3) TransitionTime = 0 (immediate)");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToColor::Type value;
            value.colorX          = 32768U;
            value.colorY          = 19660U;
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToColor::Id, value,
                               chip::NullOptional

            );
        }
        case 21: {
            LogStep(21, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 22: {
            LogStep(22, "TH reads CurrentX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentX::Id, true,
                                 chip::NullOptional);
        }
        case 23: {
            LogStep(23, "TH reads CurrentY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentY::Id, true,
                                 chip::NullOptional);
        }
        case 24: {
            LogStep(24, "TH sends Off command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 25: {
            LogStep(25,
                    "TH sends MoveToColor command to DUT, with ColorX = 13107/0x3333 ColorY = 13107/0x3333 TransitionTime = 0 "
                    "(immediate)");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToColor::Type value;
            value.colorX          = 13107U;
            value.colorY          = 13107U;
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToColor::Id, value,
                               chip::NullOptional

            );
        }
        case 26: {
            LogStep(26, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 27: {
            LogStep(27, "TH reads CurrentX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentX::Id, true,
                                 chip::NullOptional);
        }
        case 28: {
            LogStep(28, "TH reads CurrentY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentY::Id, true,
                                 chip::NullOptional);
        }
        case 29: {
            LogStep(29,
                    "TH sends MoveToColor command to DUT, with ColorX = 13107/0x3333 ColorY = 32768/0x8000 TransitionTime = 0 "
                    "(immediate)");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToColor::Type value;
            value.colorX          = 13107U;
            value.colorY          = 32768U;
            value.transitionTime  = 0U;
            value.optionsMask     = 1U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToColor::Id, value,
                               chip::NullOptional

            );
        }
        case 30: {
            LogStep(30, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 31: {
            LogStep(31, "TH reads CurrentX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentX::Id, true,
                                 chip::NullOptional);
        }
        case 32: {
            LogStep(32, "TH reads CurrentY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentY::Id, true,
                                 chip::NullOptional);
        }
        case 33: {
            LogStep(33,
                    "TH sends MoveToColor command to DUT, with ColorX = 26214/0x6666 ColorY = 32768/0x8000 TransitionTime = 0 "
                    "(immediate)");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToColor::Type value;
            value.colorX          = 26214U;
            value.colorY          = 32768U;
            value.transitionTime  = 0U;
            value.optionsMask     = 1U;
            value.optionsOverride = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToColor::Id, value,
                               chip::NullOptional

            );
        }
        case 34: {
            LogStep(34, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 35: {
            LogStep(35, "TH reads CurrentX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentX::Id, true,
                                 chip::NullOptional);
        }
        case 36: {
            LogStep(36, "TH reads CurrentY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentY::Id, true,
                                 chip::NullOptional);
        }
        case 37: {
            LogStep(37, "TH writes 1 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 1U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 38: {
            LogStep(38, "TH read Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, true,
                                 chip::NullOptional);
        }
        case 39: {
            LogStep(39, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 40: {
            LogStep(40,
                    "TH sends MoveToColor command to DUT, with ColorX = 32768/0x8000 ColorY = 19660/0x4CCC TransitionTime = 0 "
                    "(immediate)");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToColor::Type value;
            value.colorX          = 32768U;
            value.colorY          = 19660U;
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToColor::Id, value,
                               chip::NullOptional

            );
        }
        case 41: {
            LogStep(41, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 42: {
            LogStep(42, "TH reads CurrentX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentX::Id, true,
                                 chip::NullOptional);
        }
        case 43: {
            LogStep(43, "TH reads CurrentY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentY::Id, true,
                                 chip::NullOptional);
        }
        case 44: {
            LogStep(44, "TH sends Off command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 45: {
            LogStep(45,
                    "TH sends MoveToColor command to DUT, with ColorX = 13107/0x3333 ColorY = 13107/0x3333 TransitionTime = 0 "
                    "(immediate)");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToColor::Type value;
            value.colorX          = 13107U;
            value.colorY          = 13107U;
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToColor::Id, value,
                               chip::NullOptional

            );
        }
        case 46: {
            LogStep(46, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 47: {
            LogStep(47, "TH reads CurrentX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentX::Id, true,
                                 chip::NullOptional);
        }
        case 48: {
            LogStep(48, "TH reads CurrentY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentY::Id, true,
                                 chip::NullOptional);
        }
        case 49: {
            LogStep(49,
                    "TH sends MoveToColor command to DUT, with ColorX = 13107/0x3333 ColorY = 32768/0x8000 TransitionTime = 0 "
                    "(immediate)");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToColor::Type value;
            value.colorX          = 13107U;
            value.colorY          = 32768U;
            value.transitionTime  = 0U;
            value.optionsMask     = 1U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToColor::Id, value,
                               chip::NullOptional

            );
        }
        case 50: {
            LogStep(50, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 51: {
            LogStep(51, "TH reads CurrentX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentX::Id, true,
                                 chip::NullOptional);
        }
        case 52: {
            LogStep(52, "TH reads CurrentY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentY::Id, true,
                                 chip::NullOptional);
        }
        case 53: {
            LogStep(53,
                    "TH sends MoveToColor command to DUT, with ColorX = 26214/0x6666 ColorY = 32768/0x8000 TransitionTime = 0 "
                    "(immediate)");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToColor::Type value;
            value.colorX          = 26214U;
            value.colorY          = 32768U;
            value.transitionTime  = 0U;
            value.optionsMask     = 1U;
            value.optionsOverride = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToColor::Id, value,
                               chip::NullOptional

            );
        }
        case 54: {
            LogStep(54, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 55: {
            LogStep(55, "TH reads CurrentX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentX::Id, true,
                                 chip::NullOptional);
        }
        case 56: {
            LogStep(56, "TH reads CurrentY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentY::Id, true,
                                 chip::NullOptional);
        }
        case 57: {
            LogStep(57, "TH reads ColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorMode::Id, true,
                                 chip::NullOptional);
        }
        case 58: {
            LogStep(58, "TH reads EnhancedColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedColorMode::Id,
                                 true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_5_2Suite : public TestCommand
{
public:
    Test_TC_CC_5_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_5_2", 22, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_5_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    uint16_t CurrentXValue;
    uint16_t CurrentYValue;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 27200U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 36800U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 22900U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 31100U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 26350U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 35650U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 23800U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32200U));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 25500U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 34500U));
                CurrentXValue = value;
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 24650U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 33350U));
                CurrentYValue = value;
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 25500U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 34500U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 24650U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 33350U));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorMode", value, 1U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedColorMode", value, 1U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "TH sends MoveToColor command to DUT, with ColorX = 33000 ColorY = 26000 TransitionTime = 0 (immediate)");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToColor::Type value;
            value.colorX          = 33000U;
            value.colorY          = 26000U;
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToColor::Id, value,
                               chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "TH sends MoveColor command to DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.C08.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveColor::Type value;
            value.rateX           = -100;
            value.rateY           = 100;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveColor::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "TH reads CurrentX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C08.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentX::Id, true,
                                 chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH reads CurrentY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C08.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentY::Id, true,
                                 chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "TH reads CurrentX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C08.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentX::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "TH reads CurrentY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C08.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentY::Id, true,
                                 chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "TH reads CurrentX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C08.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentX::Id, true,
                                 chip::NullOptional);
        }
        case 14: {
            LogStep(14, "TH reads CurrentY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C08.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentY::Id, true,
                                 chip::NullOptional);
        }
        case 15: {
            LogStep(15, "TH sends StopMoveStep command to DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.C47.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::StopMoveStep::Type value;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StopMoveStep::Id, value,
                               chip::NullOptional

            );
        }
        case 16: {
            LogStep(16, "TH reads CurrentX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C08.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentX::Id, true,
                                 chip::NullOptional);
        }
        case 17: {
            LogStep(17, "TH reads CurrentY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C08.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentY::Id, true,
                                 chip::NullOptional);
        }
        case 18: {
            LogStep(18, "TH reads ColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorMode::Id, true,
                                 chip::NullOptional);
        }
        case 19: {
            LogStep(19, "TH reads EnhancedColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedColorMode::Id,
                                 true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Turn off light that we turned on");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 21: {
            LogStep(21, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_5_3Suite : public TestCommand
{
public:
    Test_TC_CC_5_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_5_3", 19, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_5_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 13000U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 33000U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 14000U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 20000U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 11050U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 14950U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 11900U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 16100U));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 11050U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 14950U));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 11900U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 16100U));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorMode", value, 1U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedColorMode", value, 1U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "TH sends MoveToColor command to DUT, with ColorX = 33000 ColorY = 20000 TransitionTime = 0 (immediate)");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToColor::Type value;
            value.colorX          = 33000U;
            value.colorY          = 20000U;
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToColor::Id, value,
                               chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "TH sends StepColor command to DUT, with StepX = -20000, StepY = -6000, TransitionTime = 200 (20s)");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.C09.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::StepColor::Type value;
            value.stepX           = -20000;
            value.stepY           = -6000;
            value.transitionTime  = 200U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StepColor::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "TH reads CurrentX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C08.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentX::Id, true,
                                 chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH reads CurrentY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C08.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentY::Id, true,
                                 chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "TH reads CurrentX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C08.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentX::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "TH reads CurrentY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C08.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentY::Id, true,
                                 chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Wait 5s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "TH reads CurrentX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C08.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentX::Id, true,
                                 chip::NullOptional);
        }
        case 14: {
            LogStep(14, "TH reads CurrentY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C08.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentY::Id, true,
                                 chip::NullOptional);
        }
        case 15: {
            LogStep(15, "TH reads ColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorMode::Id, true,
                                 chip::NullOptional);
        }
        case 16: {
            LogStep(16, "TH reads EnhancedColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedColorMode::Id,
                                 true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Turn off light that we turned on");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 18: {
            LogStep(18, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_6_1Suite : public TestCommand
{
public:
    Test_TC_CC_6_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_6_1", 21, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_6_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    uint16_t ColorTempPhysicalMinMiredsValue;
    uint16_t ColorTempPhysicalMaxMiredsValue;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
                ColorTempPhysicalMinMiredsValue = value;
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
                ColorTempPhysicalMaxMiredsValue = value;
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorTempPhysicalMinMiredsValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, ColorTempPhysicalMaxMiredsValue));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 246U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 334U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 230U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 310U));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 212U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 288U));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 212U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 288U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorMode", value, 2U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedColorMode", value, 2U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "TH reads ColorTempPhysicalMinMireds attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A400b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTempPhysicalMinMireds::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads ColorTempPhysicalMaxMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A400c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTempPhysicalMaxMireds::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6,
                    "TH sends MoveToColorTemperature command to DUT with ColorTemperatureMireds=310 and TransitionTime=0 "
                    "(immediately).");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.C0a.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToColorTemperature::Type value;
            value.colorTemperature = 310U;
            value.transitionTime   = 0U;
            value.optionsMask      = 0U;
            value.optionsOverride  = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToColorTemperature::Id,
                               value, chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 8: {
            LogStep(8,
                    "TH sends MoveToColorTemperatur command to DUT with ColorTemperatureMireds=250 and TransitionTime=300 (30s).");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.C0a.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToColorTemperature::Type value;
            value.colorTemperature = 250U;
            value.transitionTime   = 300U;
            value.optionsMask      = 0U;
            value.optionsOverride  = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToColorTemperature::Id,
                               value, chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && CC.S.C0a.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 12: {
            LogStep(12, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && CC.S.C0a.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && CC.S.C0a.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Wait 5s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 16: {
            LogStep(16, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && CC.S.C0a.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "TH reads ColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorMode::Id, true,
                                 chip::NullOptional);
        }
        case 18: {
            LogStep(18, "TH reads EnhancedColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedColorMode::Id,
                                 true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Turn Off light that we turned on");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 20: {
            LogStep(20, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_6_2Suite : public TestCommand
{
public:
    Test_TC_CC_6_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_6_2", 32, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_6_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    uint16_t ColorTempPhysicalMinMiredsValue;
    uint16_t ColorTempPhysicalMaxMiredsValue;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
                ColorTempPhysicalMinMiredsValue = value;
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
                ColorTempPhysicalMaxMiredsValue = value;
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorTempPhysicalMinMiredsValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, ColorTempPhysicalMaxMiredsValue));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorTempPhysicalMinMiredsValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, ColorTempPhysicalMaxMiredsValue));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorTempPhysicalMinMiredsValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, ColorTempPhysicalMaxMiredsValue));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorTemperatureMireds", value, ColorTempPhysicalMaxMiredsValue));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorTempPhysicalMinMiredsValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, ColorTempPhysicalMaxMiredsValue));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorTempPhysicalMinMiredsValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, ColorTempPhysicalMaxMiredsValue));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorTempPhysicalMinMiredsValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, ColorTempPhysicalMaxMiredsValue));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorTemperatureMireds", value, ColorTempPhysicalMinMiredsValue));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorTempPhysicalMinMiredsValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, ColorTempPhysicalMaxMiredsValue));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorTempPhysicalMinMiredsValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, ColorTempPhysicalMaxMiredsValue));
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorTempPhysicalMinMiredsValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, ColorTempPhysicalMaxMiredsValue));
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorMode", value, 2U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedColorMode", value, 2U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "TH reads ColorTempPhysicalMinMireds attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A400b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTempPhysicalMinMireds::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads ColorTempPhysicalMaxMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A400c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTempPhysicalMaxMireds::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6,
                    "TH sends MoveToColorTemperature command to DUT with ColorTemperatureMireds=(ColorTempPhysicalMinMireds + "
                    "ColorTempPhysicalMaxMireds)/2 and TransitionTime=0 (immediately).");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.C0a.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToColorTemperature::Type value;
            value.colorTemperature = static_cast<uint16_t>((ColorTempPhysicalMinMiredsValue + ColorTempPhysicalMaxMiredsValue) / 2);
            value.transitionTime   = 0U;
            value.optionsMask      = 0U;
            value.optionsOverride  = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToColorTemperature::Id,
                               value, chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 8: {
            LogStep(8,
                    "TH sends MoveColorTemperature command to DUT with MoveMode = 0x01 (up), Rate = (ColorTempPhysicalMaxMireds - "
                    "ColorTempPhysicalMinMireds)/40");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.C4b.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveColorTemperature::Type value;
            value.moveMode = static_cast<chip::app::Clusters::ColorControl::HueMoveMode>(1);
            value.rate     = static_cast<uint16_t>((ColorTempPhysicalMaxMiredsValue - ColorTempPhysicalMinMiredsValue) / 40);
            value.colorTemperatureMinimumMireds = ColorTempPhysicalMinMiredsValue;
            value.colorTemperatureMaximumMireds = ColorTempPhysicalMaxMiredsValue;
            value.optionsMask                   = 0U;
            value.optionsOverride               = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveColorTemperature::Id,
                               value, chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && CC.S.C4b.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 12: {
            LogStep(12, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && CC.S.C4b.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Wait 5s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && CC.S.C4b.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15,
                    "TH sends MoveColorTemperature command to DUT with MoveMode = 0x03(down), Rate = (ColorTempPhysicalMaxMireds - "
                    "ColorTempPhysicalMinMireds)/20");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.C4b.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveColorTemperature::Type value;
            value.moveMode = static_cast<chip::app::Clusters::ColorControl::HueMoveMode>(3);
            value.rate     = static_cast<uint16_t>((ColorTempPhysicalMaxMiredsValue - ColorTempPhysicalMinMiredsValue) / 20);
            value.colorTemperatureMinimumMireds = ColorTempPhysicalMinMiredsValue;
            value.colorTemperatureMaximumMireds = ColorTempPhysicalMaxMiredsValue;
            value.optionsMask                   = 0U;
            value.optionsOverride               = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveColorTemperature::Id,
                               value, chip::NullOptional

            );
        }
        case 16: {
            LogStep(16, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && CC.S.C4b.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 19: {
            LogStep(19, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && CC.S.C4b.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Wait 5s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 21: {
            LogStep(21, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && CC.S.C4b.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 22: {
            LogStep(22,
                    "TH sends MoveColorTemperature command to DUT with MoveMode = 0x01(up), Rate = (ColorTempPhysicalMaxMireds - "
                    "ColorTempPhysicalMinMireds)/20");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.C4b.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveColorTemperature::Type value;
            value.moveMode = static_cast<chip::app::Clusters::ColorControl::HueMoveMode>(1);
            value.rate     = static_cast<uint16_t>((ColorTempPhysicalMaxMiredsValue - ColorTempPhysicalMinMiredsValue) / 20);
            value.colorTemperatureMinimumMireds = ColorTempPhysicalMinMiredsValue;
            value.colorTemperatureMaximumMireds = ColorTempPhysicalMaxMiredsValue;
            value.optionsMask                   = 0U;
            value.optionsOverride               = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveColorTemperature::Id,
                               value, chip::NullOptional

            );
        }
        case 23: {
            LogStep(23, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 24: {
            LogStep(24,
                    "After 10 seconds, TH sends MoveColorTemperature command to DUT with MoveMode = 0x00(stop), Rate = "
                    "(ColorTempPhysicalMaxMireds - ColorTempPhysicalMinMireds)/20");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.C4b.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveColorTemperature::Type value;
            value.moveMode = static_cast<chip::app::Clusters::ColorControl::HueMoveMode>(0);
            value.rate     = static_cast<uint16_t>((ColorTempPhysicalMaxMiredsValue - ColorTempPhysicalMinMiredsValue) / 20);
            value.colorTemperatureMinimumMireds = ColorTempPhysicalMinMiredsValue;
            value.colorTemperatureMaximumMireds = ColorTempPhysicalMaxMiredsValue;
            value.optionsMask                   = 0U;
            value.optionsOverride               = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveColorTemperature::Id,
                               value, chip::NullOptional

            );
        }
        case 25: {
            LogStep(25, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && CC.S.C4b.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 26: {
            LogStep(26, "Wait 2s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 2000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 27: {
            LogStep(27, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && CC.S.C4b.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 28: {
            LogStep(28, "TH reads ColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorMode::Id, true,
                                 chip::NullOptional);
        }
        case 29: {
            LogStep(29, "TH reads EnhancedColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedColorMode::Id,
                                 true, chip::NullOptional);
        }
        case 30: {
            LogStep(30, "Turn off light that we turned on");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 31: {
            LogStep(31, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_6_3Suite : public TestCommand
{
public:
    Test_TC_CC_6_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_6_3", 26, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_6_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    uint16_t ColorTempPhysicalMinMiredsValue;
    uint16_t ColorTempPhysicalMaxMiredsValue;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
                ColorTempPhysicalMinMiredsValue = value;
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
                ColorTempPhysicalMaxMiredsValue = value;
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorTempPhysicalMinMiredsValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, ColorTempPhysicalMaxMiredsValue));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorTempPhysicalMinMiredsValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, ColorTempPhysicalMaxMiredsValue));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorTempPhysicalMinMiredsValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, ColorTempPhysicalMaxMiredsValue));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorTemperatureMireds", value, ColorTempPhysicalMaxMiredsValue));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorTempPhysicalMinMiredsValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, ColorTempPhysicalMaxMiredsValue));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorTempPhysicalMinMiredsValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, ColorTempPhysicalMaxMiredsValue));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorTempPhysicalMinMiredsValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, ColorTempPhysicalMaxMiredsValue));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorTemperatureMireds", value, ColorTempPhysicalMinMiredsValue));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorTempPhysicalMinMiredsValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, ColorTempPhysicalMaxMiredsValue));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorMode", value, 2U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedColorMode", value, 2U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "TH reads ColorTempPhysicalMinMireds attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A400b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTempPhysicalMinMireds::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads ColorTempPhysicalMaxMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A400c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTempPhysicalMaxMireds::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6,
                    "TH sends MoveToColorTemperature command to DUT with ColorTemperatureMireds=(ColorTempPhysicalMinMireds + "
                    "ColorTempPhysicalMaxMireds)/2 and TransitionTime=0 (immediately).");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.C0a.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToColorTemperature::Type value;
            value.colorTemperature = static_cast<uint16_t>((ColorTempPhysicalMinMiredsValue + ColorTempPhysicalMaxMiredsValue) / 2);
            value.transitionTime   = 0U;
            value.optionsMask      = 0U;
            value.optionsOverride  = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToColorTemperature::Id,
                               value, chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 8: {
            LogStep(8,
                    "TH sends StepColorTemperature command to DUT with StepMode = 0x01 (up), StepSize = "
                    "(ColorTempPhysicalMaxMireds - ColorTempPhysicalMinMireds)/2 and TransitionTime = 200 (20s).");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.C4c.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::StepColorTemperature::Type value;
            value.stepMode       = static_cast<chip::app::Clusters::ColorControl::HueStepMode>(1);
            value.stepSize       = static_cast<uint16_t>((ColorTempPhysicalMinMiredsValue + ColorTempPhysicalMaxMiredsValue) / 2);
            value.transitionTime = 200U;
            value.colorTemperatureMinimumMireds = ColorTempPhysicalMinMiredsValue;
            value.colorTemperatureMaximumMireds = ColorTempPhysicalMaxMiredsValue;
            value.optionsMask                   = 0U;
            value.optionsOverride               = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StepColorTemperature::Id,
                               value, chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && CC.S.C4c.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 12: {
            LogStep(12, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && CC.S.C4c.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Wait 5s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && CC.S.C4c.Rsp && PICS_SKIP_SAMPLE_APP"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15,
                    "TH sends StepColorTemperature command to DUT with StepMode = 0x03 (down), StepSize = "
                    "(ColorTempPhysicalMaxMireds - ColorTempPhysicalMinMireds) and TransitionTime = 200 (20s).");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.C4c.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::StepColorTemperature::Type value;
            value.stepMode       = static_cast<chip::app::Clusters::ColorControl::HueStepMode>(3);
            value.stepSize       = static_cast<uint16_t>(ColorTempPhysicalMaxMiredsValue - ColorTempPhysicalMinMiredsValue);
            value.transitionTime = 200U;
            value.colorTemperatureMinimumMireds = ColorTempPhysicalMinMiredsValue;
            value.colorTemperatureMaximumMireds = ColorTempPhysicalMaxMiredsValue;
            value.optionsMask                   = 0U;
            value.optionsOverride               = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StepColorTemperature::Id,
                               value, chip::NullOptional

            );
        }
        case 16: {
            LogStep(16, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && CC.S.C4c.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 19: {
            LogStep(19, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && CC.S.C4c.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Wait 5s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 21: {
            LogStep(21, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && CC.S.C4c.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "TH reads ColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorMode::Id, true,
                                 chip::NullOptional);
        }
        case 23: {
            LogStep(23, "TH reads EnhancedColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedColorMode::Id,
                                 true, chip::NullOptional);
        }
        case 24: {
            LogStep(24, "Turn Off light that we turned on");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 25: {
            LogStep(25, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_7_2Suite : public TestCommand
{
public:
    Test_TC_CC_7_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_7_2", 31, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_7_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 21250U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 28750U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 25500U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 34500U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 29750U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 40250U));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 29750U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 40250U));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 17000U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 23000U));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 12750U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 17250U));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 8500U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 11500U));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 8500U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 11500U));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorMode", value, 0U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedColorMode", value, 3U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3,
                    "TH sends EnhancedMoveToHue command to DUT with EnhancedHue=20000, Direction=0x00 (shortest distance) and "
                    "TransitionTime=0 (immediately).");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveToHue::Type value;
            value.enhancedHue     = 20000U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveToHue::Id,
                               value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "TH sends EnhancedMoveHue command to DUT with MoveMode=0x01 (up) and Rate=500 (units/s)");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveHue::Type value;
            value.moveMode        = static_cast<chip::app::Clusters::ColorControl::HueMoveMode>(1);
            value.rate            = 500U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveHue::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 11: {
            LogStep(11, "TH sends EnhancedMoveHue command to DUT with MoveMode=0x00 (stop) and Rate=5 (units/s)");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveHue::Type value;
            value.moveMode        = static_cast<chip::app::Clusters::ColorControl::HueMoveMode>(0);
            value.rate            = 5U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveHue::Id, value,
                               chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Wait 2s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 2000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 15: {
            LogStep(15,
                    "TH sends EnhancedMoveToHue command to DUT with EnhancedHue=25000, Direction=0x00 (shortest distance) and "
                    "TransitionTime=0 (immediately).");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveToHue::Type value;
            value.enhancedHue     = 25000U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveToHue::Id,
                               value, chip::NullOptional

            );
        }
        case 16: {
            LogStep(16, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17, "TH sends EnhancedMoveHue command to DUT with MoveMode=0x03 (down) and Rate=500 (units/s)");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveHue::Type value;
            value.moveMode        = static_cast<chip::app::Clusters::ColorControl::HueMoveMode>(3);
            value.rate            = 500U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveHue::Id, value,
                               chip::NullOptional

            );
        }
        case 18: {
            LogStep(18, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 19: {
            LogStep(19, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 21: {
            LogStep(21, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 23: {
            LogStep(23, "TH sends EnhancedMoveHue command to DUT with MoveMode=0x00 (stop) and Rate=5 (units/s)");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveHue::Type value;
            value.moveMode        = static_cast<chip::app::Clusters::ColorControl::HueMoveMode>(0);
            value.rate            = 5U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveHue::Id, value,
                               chip::NullOptional

            );
        }
        case 24: {
            LogStep(24, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 25: {
            LogStep(25, "Wait 2s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 2000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 26: {
            LogStep(26, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 27: {
            LogStep(27, "TH reads ColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorMode::Id, true,
                                 chip::NullOptional);
        }
        case 28: {
            LogStep(28, "TH reads EnhancedColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedColorMode::Id,
                                 true, chip::NullOptional);
        }
        case 29: {
            LogStep(29, "Turn Off light that we turned on");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 30: {
            LogStep(30, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_7_3Suite : public TestCommand
{
public:
    Test_TC_CC_7_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_7_3", 29, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_7_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 6800U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9200U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 8500U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 11500U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 10200U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 13800U));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 10200U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 13800U));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 8500U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 11500U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 6800U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9200U));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 5100U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 6900U));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 5100U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 6900U));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorMode", value, 0U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedColorMode", value, 3U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3,
                    "TH sends EnhancedMoveToHue command to DUT with EnhancedHue=6000, Direction=0x00 (shortest distance) and "
                    "TransitionTime=0 (immediately).");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveToHue::Type value;
            value.enhancedHue     = 6000U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveToHue::Id,
                               value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5,
                    "TH sends EnhancedStepHue command to DUT with StepMode=0x01 (up), StepSize=6000 and TransitionTime=300 (30s).");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedStepHue::Type value;
            value.stepMode        = static_cast<chip::app::Clusters::ColorControl::HueStepMode>(1);
            value.stepSize        = 6000U;
            value.transitionTime  = 300U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedStepHue::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 11: {
            LogStep(11, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Wait 5s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 14: {
            LogStep(14,
                    "TH sends EnhancedMoveToHue command to DUT with EnhancedHue=12000, Direction=0x00 (shortest distance) and "
                    "TransitionTime=0 (immediately).");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveToHue::Type value;
            value.enhancedHue     = 12000U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveToHue::Id,
                               value, chip::NullOptional

            );
        }
        case 15: {
            LogStep(15, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 16: {
            LogStep(
                16,
                "TH sends EnhancedStepHue command to DUT with StepMode=0x03 (down), StepSize=6000 and TransitionTime=300 (30s)");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedStepHue::Type value;
            value.stepMode        = static_cast<chip::app::Clusters::ColorControl::HueStepMode>(3);
            value.stepSize        = 6000U;
            value.transitionTime  = 300U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedStepHue::Id, value,
                               chip::NullOptional

            );
        }
        case 17: {
            LogStep(17, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 18: {
            LogStep(18, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 20: {
            LogStep(20, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 22: {
            LogStep(22, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "Wait 5s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 24: {
            LogStep(24, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 25: {
            LogStep(25, "TH reads ColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorMode::Id, true,
                                 chip::NullOptional);
        }
        case 26: {
            LogStep(26, "TH reads EnhancedColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedColorMode::Id,
                                 true, chip::NullOptional);
        }
        case 27: {
            LogStep(27, "Turn Off light that we turned on");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 28: {
            LogStep(28, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_7_4Suite : public TestCommand
{
public:
    Test_TC_CC_7_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_7_4", 21, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_7_4Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 17000U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 23000U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 42U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 58U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 16000U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 20000U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 50U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 80U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 13600U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 18400U));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 68U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 92U));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedCurrentHue", value, 16000U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentSaturation", value, 80U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorMode", value, 0U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedColorMode", value, 3U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3,
                    "TH sends EnhancedMoveToHueAndSaturation command to DUT with EnhancedHue=20000, Saturation=50 and "
                    "TransitionTime=0 (immediately)");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.C43.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveToHueAndSaturation::Type value;
            value.enhancedHue     = 20000U;
            value.saturation      = 50U;
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                               ColorControl::Commands::EnhancedMoveToHueAndSaturation::Id, value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 7: {
            LogStep(7,
                    "TH sends EnhancedMoveToHueAndSaturation command to DUT with EnhancedHue=16000, Saturation=80 and "
                    "TransitionTime=200 (20s)");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.C43.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveToHueAndSaturation::Type value;
            value.enhancedHue     = 16000U;
            value.saturation      = 80U;
            value.transitionTime  = 200U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                               ColorControl::Commands::EnhancedMoveToHueAndSaturation::Id, value, chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 12: {
            LogStep(12, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Wait 5s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 15: {
            LogStep(15, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "TH reads ColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorMode::Id, true,
                                 chip::NullOptional);
        }
        case 18: {
            LogStep(18, "TH reads EnhancedColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedColorMode::Id,
                                 true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Turn Off light that we turned on");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 20: {
            LogStep(20, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_8_1Suite : public TestCommand
{
public:
    Test_TC_CC_8_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_8_1", 39, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_8_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    uint16_t ColorTempPhysicalMinMireds;
    uint16_t ColorTempPhysicalMaxMireds;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 216U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 216U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 170U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 230U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 170U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 230U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
                ColorTempPhysicalMinMireds = value;
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
                ColorTempPhysicalMaxMireds = value;
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorTempPhysicalMinMireds));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, ColorTempPhysicalMaxMireds));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorTempPhysicalMinMireds));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, ColorTempPhysicalMaxMireds));
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 21250U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 28750U));
            }
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 21250U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 28750U));
            }
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3,
                    "TH sends MoveToHue command to DUT with Hue=200, Direction=0x00 (shortest distance) and TransitionTime=0 "
                    "(immediately).");
            VerifyOrDo(!ShouldSkip("CC.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToHue::Type value;
            value.hue             = 200U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToHue::Id, value,
                               chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "TH sends MoveHue command to DUT with MoveMode=0x01 (up) and Rate=5 (units/s)");
            VerifyOrDo(!ShouldSkip("CC.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveHue::Type value;
            value.moveMode        = static_cast<chip::app::Clusters::ColorControl::HueMoveMode>(1);
            value.rate            = 5U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveHue::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "TH sends StopMoveStep command to DUT");
            VerifyOrDo(!ShouldSkip("CC.S.C47.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::StopMoveStep::Type value;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StopMoveStep::Id, value,
                               chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A0000 && CC.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Wait 2s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 2000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A0000 && CC.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "TH sends MoveToSaturation command to DUT with Saturation=150 and TransitionTime=0 (immediately)");
            VerifyOrDo(!ShouldSkip("CC.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToSaturation::Type value;
            value.saturation      = 150U;
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToSaturation::Id,
                               value, chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "TH sends MoveSaturation command to DUT with MoveMode=0x01 (up) and Rate=5 (units/s)");
            VerifyOrDo(!ShouldSkip("CC.S.C04.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveSaturation::Type value;
            value.moveMode        = static_cast<chip::app::Clusters::ColorControl::SaturationMoveMode>(1);
            value.rate            = 5U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveSaturation::Id, value,
                               chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 15: {
            LogStep(15, "TH sends StopMoveStep command to DUT");
            VerifyOrDo(!ShouldSkip("CC.S.C47.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::StopMoveStep::Type value;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StopMoveStep::Id, value,
                               chip::NullOptional

            );
        }
        case 16: {
            LogStep(16, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Wait 2s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 2000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 18: {
            LogStep(18, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "TH reads ColorTempPhysicalMinMireds attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A400b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTempPhysicalMinMireds::Id, true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "TH reads ColorTempPhysicalMaxMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.A400c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTempPhysicalMaxMireds::Id, true, chip::NullOptional);
        }
        case 21: {
            LogStep(21,
                    "TH sends MoveToColorTemperature command to DUT with ColorTemperatureMireds= ColorTempPhysicalMaxMireds / 2 "
                    "and TransitionTime=0 (immediately).");
            VerifyOrDo(!ShouldSkip("CC.S.C0a.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToColorTemperature::Type value;
            value.colorTemperature = static_cast<uint16_t>((ColorTempPhysicalMinMireds + ColorTempPhysicalMaxMireds) / 2);
            value.transitionTime   = 0U;
            value.optionsMask      = 0U;
            value.optionsOverride  = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToColorTemperature::Id,
                               value, chip::NullOptional

            );
        }
        case 22: {
            LogStep(22, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 23: {
            LogStep(23,
                    "TH sends MoveColorTemperature command to DUT with MoveMode = 0x01 (up), Rate = (ColorTempPhysicalMaxMireds - "
                    "ColorTempPhysicalMinMireds)/40");
            VerifyOrDo(!ShouldSkip("CC.S.C4b.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveColorTemperature::Type value;
            value.moveMode = static_cast<chip::app::Clusters::ColorControl::HueMoveMode>(1);
            value.rate     = static_cast<uint16_t>((ColorTempPhysicalMaxMireds - ColorTempPhysicalMinMireds) / 40);
            value.colorTemperatureMinimumMireds = ColorTempPhysicalMinMireds;
            value.colorTemperatureMaximumMireds = ColorTempPhysicalMaxMireds;
            value.optionsMask                   = 0U;
            value.optionsOverride               = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveColorTemperature::Id,
                               value, chip::NullOptional

            );
        }
        case 24: {
            LogStep(24, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 25: {
            LogStep(25, "TH sends StopMoveStep command to DUT");
            VerifyOrDo(!ShouldSkip("CC.S.C4b.Rsp && CC.S.C47.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::StopMoveStep::Type value;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StopMoveStep::Id, value,
                               chip::NullOptional

            );
        }
        case 26: {
            LogStep(26, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.A0007 && CC.S.C4b.Rsp && CC.S.C47.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 27: {
            LogStep(27, "Wait 2s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 2000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 28: {
            LogStep(28, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.A0007 && CC.S.C4b.Rsp && CC.S.C47.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 29: {
            LogStep(29,
                    "TH sends EnhancedMoveToHue command to DUT with EnhancedHue=20000, Direction=0x00 (shortest distance) and "
                    "TransitionTime=0 (immediately).");
            VerifyOrDo(!ShouldSkip("CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveToHue::Type value;
            value.enhancedHue     = 20000U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveToHue::Id,
                               value, chip::NullOptional

            );
        }
        case 30: {
            LogStep(30, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 31: {
            LogStep(31, "TH sends EnhancedMoveHue command to DUT with MoveMode=0x01 (up) and Rate=500 (units/s)");
            VerifyOrDo(!ShouldSkip("CC.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveHue::Type value;
            value.moveMode        = static_cast<chip::app::Clusters::ColorControl::HueMoveMode>(1);
            value.rate            = 500U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveHue::Id, value,
                               chip::NullOptional

            );
        }
        case 32: {
            LogStep(32, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 33: {
            LogStep(33, "TH sends StopMoveStep command to DUT");
            VerifyOrDo(!ShouldSkip("CC.S.C47.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::StopMoveStep::Type value;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StopMoveStep::Id, value,
                               chip::NullOptional

            );
        }
        case 34: {
            LogStep(34, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A4000 && CC.S.C47.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 35: {
            LogStep(35, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 36: {
            LogStep(36, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A4000 && CC.S.C47.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 37: {
            LogStep(37, "Turn Off light that we turned on");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 38: {
            LogStep(38, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_OPCREDS_1_2Suite : public TestCommand
{
public:
    Test_TC_OPCREDS_1_2Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_OPCREDS_1_2", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_OPCREDS_1_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 6UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 7UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 9UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 10UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 11UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 8UL));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH reads the ClusterRevision from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads the FeatureMap from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH reads AttributeList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads AcceptedCommandList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads GeneratedCommandList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BINFO_1_1Suite : public TestCommand
{
public:
    Test_TC_BINFO_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BINFO_1_1", 14, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BINFO_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 6UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 7UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 8UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 9UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 10UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 19UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 11UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 12UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 13UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 14UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 15UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 16UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 17UL));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 18UL));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH reads the ClusterRevision from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::ClusterRevision::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads the FeatureMap from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH reads AttributeList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads optional attribute(ManufacturingDate) in attributeList");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads optional attribute(PartNumber) in attributeList");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH reads optional attribute(ProductURL) in attributeList");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000d"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH reads optional attribute(ProductLabel) in attributeList");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH reads optional attribute(SerialNumber) in attributeList");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 9: {
            LogStep(9, "TH reads optional attribute(LocalConfigDisabled) in attributeList");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 10: {
            LogStep(10, "TH reads optional attribute(Reachable) in attributeList");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "TH reads optional attribute(UniqueID) in attributeList");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 12: {
            LogStep(12, "TH1 reads AcceptedCommandList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 13: {
            LogStep(13, "TH1 reads GeneratedCommandList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::GeneratedCommandList::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BINFO_2_1Suite : public TestCommand
{
public:
    Test_TC_BINFO_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BINFO_2_1", 68, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BINFO_2_1Suite()
    {
        if (VendorNameValueBuffer != nullptr)
        {
            chip::Platform::MemoryFree(VendorNameValueBuffer);
            VendorNameValueBuffer = nullptr;
        }
        if (ProductNameValueBuffer != nullptr)
        {
            chip::Platform::MemoryFree(ProductNameValueBuffer);
            ProductNameValueBuffer = nullptr;
        }
        if (NodeLabelValueBuffer != nullptr)
        {
            chip::Platform::MemoryFree(NodeLabelValueBuffer);
            NodeLabelValueBuffer = nullptr;
        }
        if (HardwareVersionStringValueBuffer != nullptr)
        {
            chip::Platform::MemoryFree(HardwareVersionStringValueBuffer);
            HardwareVersionStringValueBuffer = nullptr;
        }
        if (SoftwareVersionStringValueBuffer != nullptr)
        {
            chip::Platform::MemoryFree(SoftwareVersionStringValueBuffer);
            SoftwareVersionStringValueBuffer = nullptr;
        }
        if (ManufacturingDateValueBuffer != nullptr)
        {
            chip::Platform::MemoryFree(ManufacturingDateValueBuffer);
            ManufacturingDateValueBuffer = nullptr;
        }
        if (PartNumberValueBuffer != nullptr)
        {
            chip::Platform::MemoryFree(PartNumberValueBuffer);
            PartNumberValueBuffer = nullptr;
        }
        if (ProductURLValueBuffer != nullptr)
        {
            chip::Platform::MemoryFree(ProductURLValueBuffer);
            ProductURLValueBuffer = nullptr;
        }
        if (ProductLabelValueBuffer != nullptr)
        {
            chip::Platform::MemoryFree(ProductLabelValueBuffer);
            ProductLabelValueBuffer = nullptr;
        }
        if (SerialNumberValueBuffer != nullptr)
        {
            chip::Platform::MemoryFree(SerialNumberValueBuffer);
            SerialNumberValueBuffer = nullptr;
        }
        if (UniqueIDValueBuffer != nullptr)
        {
            chip::Platform::MemoryFree(UniqueIDValueBuffer);
            UniqueIDValueBuffer = nullptr;
        }
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    uint16_t DataModelRevisionValue;
    char * VendorNameValueBuffer = nullptr;
    chip::CharSpan VendorNameValue;
    chip::VendorId VendorIDValue;
    char * ProductNameValueBuffer = nullptr;
    chip::CharSpan ProductNameValue;
    uint16_t ProductIDValue;
    char * NodeLabelValueBuffer = nullptr;
    chip::CharSpan NodeLabelValue;
    uint16_t HardwareVersionValue;
    char * HardwareVersionStringValueBuffer = nullptr;
    chip::CharSpan HardwareVersionStringValue;
    uint32_t SoftwareVersionValue;
    char * SoftwareVersionStringValueBuffer = nullptr;
    chip::CharSpan SoftwareVersionStringValue;
    char * ManufacturingDateValueBuffer = nullptr;
    chip::CharSpan ManufacturingDateValue;
    char * PartNumberValueBuffer = nullptr;
    chip::CharSpan PartNumberValue;
    char * ProductURLValueBuffer = nullptr;
    chip::CharSpan ProductURLValue;
    char * ProductLabelValueBuffer = nullptr;
    chip::CharSpan ProductLabelValue;
    char * SerialNumberValueBuffer = nullptr;
    chip::CharSpan SerialNumberValue;
    char * UniqueIDValueBuffer = nullptr;
    chip::CharSpan UniqueIDValue;
    chip::app::Clusters::Basic::Structs::CapabilityMinimaStruct::DecodableType CapabilityMinimaValue;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65534U));
                DataModelRevisionValue = value;
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("dataModelRevision", value, DataModelRevisionValue));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 32));
                if (VendorNameValueBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(VendorNameValueBuffer);
                }
                VendorNameValueBuffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.size()));
                memcpy(VendorNameValueBuffer, value.data(), value.size());
                VendorNameValue = chip::CharSpan(VendorNameValueBuffer, value.size());
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("vendorName", value, VendorNameValue));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::VendorId value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "vendor_id", "vendor_id"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65521U));
                VendorIDValue = value;
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::VendorId value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("vendorID", value, VendorIDValue));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 32));
                if (ProductNameValueBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(ProductNameValueBuffer);
                }
                ProductNameValueBuffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.size()));
                memcpy(ProductNameValueBuffer, value.data(), value.size());
                ProductNameValue = chip::CharSpan(ProductNameValueBuffer, value.size());
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("productName", value, ProductNameValue));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65534U));
                ProductIDValue = value;
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("productID", value, ProductIDValue));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 32));
                if (NodeLabelValueBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(NodeLabelValueBuffer);
                }
                NodeLabelValueBuffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.size()));
                memcpy(NodeLabelValueBuffer, value.data(), value.size());
                NodeLabelValue = chip::CharSpan(NodeLabelValueBuffer, value.size());
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("nodeLabel", value, chip::CharSpan("newnode", 7)));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 16));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("location", value, chip::CharSpan("in", 2)));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65534U));
                HardwareVersionValue = value;
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("hardwareVersion", value, HardwareVersionValue));
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMinLength("value", value, 1));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 64));
                if (HardwareVersionStringValueBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(HardwareVersionStringValueBuffer);
                }
                HardwareVersionStringValueBuffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.size()));
                memcpy(HardwareVersionStringValueBuffer, value.data(), value.size());
                HardwareVersionStringValue = chip::CharSpan(HardwareVersionStringValueBuffer, value.size());
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("hardwareVersionString", value, HardwareVersionStringValue));
            }
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967294UL));
                SoftwareVersionValue = value;
            }
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("softwareVersion", value, SoftwareVersionValue));
            }
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinLength("value", value, 1));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 64));
                if (SoftwareVersionStringValueBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(SoftwareVersionStringValueBuffer);
                }
                SoftwareVersionStringValueBuffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.size()));
                memcpy(SoftwareVersionStringValueBuffer, value.data(), value.size());
                SoftwareVersionStringValue = chip::CharSpan(SoftwareVersionStringValueBuffer, value.size());
            }
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("softwareVersionString", value, SoftwareVersionStringValue));
            }
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMinLength("value", value, 8));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 16));
                if (ManufacturingDateValueBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(ManufacturingDateValueBuffer);
                }
                ManufacturingDateValueBuffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.size()));
                memcpy(ManufacturingDateValueBuffer, value.data(), value.size());
                ManufacturingDateValue = chip::CharSpan(ManufacturingDateValueBuffer, value.size());
            }
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("manufacturingDate", value, ManufacturingDateValue));
            }
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 32));
                if (PartNumberValueBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(PartNumberValueBuffer);
                }
                PartNumberValueBuffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.size()));
                memcpy(PartNumberValueBuffer, value.data(), value.size());
                PartNumberValue = chip::CharSpan(PartNumberValueBuffer, value.size());
            }
            break;
        case 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 44:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("partNumber", value, PartNumberValue));
            }
            break;
        case 45:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "long_char_string", "long_char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 256));
                if (ProductURLValueBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(ProductURLValueBuffer);
                }
                ProductURLValueBuffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.size()));
                memcpy(ProductURLValueBuffer, value.data(), value.size());
                ProductURLValue = chip::CharSpan(ProductURLValueBuffer, value.size());
            }
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 47:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 48:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("productURL", value, ProductURLValue));
            }
            break;
        case 49:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 64));
                if (ProductLabelValueBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(ProductLabelValueBuffer);
                }
                ProductLabelValueBuffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.size()));
                memcpy(ProductLabelValueBuffer, value.data(), value.size());
                ProductLabelValue = chip::CharSpan(ProductLabelValueBuffer, value.size());
            }
            break;
        case 50:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 51:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 52:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("productLabel", value, ProductLabelValue));
            }
            break;
        case 53:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 32));
                if (SerialNumberValueBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(SerialNumberValueBuffer);
                }
                SerialNumberValueBuffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.size()));
                memcpy(SerialNumberValueBuffer, value.data(), value.size());
                SerialNumberValue = chip::CharSpan(SerialNumberValueBuffer, value.size());
            }
            break;
        case 54:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 55:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("serialNumber", value, SerialNumberValue));
            }
            break;
        case 56:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("localConfigDisabled", value, false));
                VerifyOrReturn(CheckConstraintType("value", "boolean", "boolean"));
            }
            break;
        case 57:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 58:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("localConfigDisabled", value, true));
            }
            break;
        case 59:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("reachable", value, true));
                VerifyOrReturn(CheckConstraintType("value", "boolean", "boolean"));
            }
            break;
        case 60:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 61:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("reachable", value, true));
                VerifyOrReturn(CheckConstraintType("value", "boolean", "boolean"));
            }
            break;
        case 62:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 32));
                if (UniqueIDValueBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(UniqueIDValueBuffer);
                }
                UniqueIDValueBuffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.size()));
                memcpy(UniqueIDValueBuffer, value.data(), value.size());
                UniqueIDValue = chip::CharSpan(UniqueIDValueBuffer, value.size());
            }
            break;
        case 63:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 64:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("uniqueID", value, UniqueIDValue));
            }
            break;
        case 65:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Basic::Structs::CapabilityMinimaStruct::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                CapabilityMinimaValue = value;
            }
            break;
        case 66:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 67:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Basic::Structs::CapabilityMinimaStruct::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "During Commissioning, TH Saves the CountryCode Information from SetRegulatoryConfig command");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 2: {
            LogStep(2, "TH reads DataModelRevision from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::DataModelRevision::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH writes DataModelRevision from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint16_t value;
            value = 4388U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::DataModelRevision::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads DataModelRevision from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::DataModelRevision::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads VendorName from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::VendorName::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH writes VendorName from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("samplegarbage: not in length on purpose", 6);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::VendorName::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH reads VendorName from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::VendorName::Id, true,
                                 chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH reads VendorID from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::VendorID::Id, true,
                                 chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Verify that VendorID matches the value assigned to this manufacturer");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && BINFO.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "TH writes VendorID from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::VendorId value;
            value = static_cast<chip::VendorId>(17);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::VendorID::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "TH reads VendorID from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::VendorID::Id, true,
                                 chip::NullOptional);
        }
        case 12: {
            LogStep(12, "TH reads ProductName from the DUT");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::ProductName::Id, true,
                                 chip::NullOptional);
        }
        case 13: {
            LogStep(13, "TH writes ProductName from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("newproductgarbage: not in length on purpose", 10);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::ProductName::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "TH reads ProductName from the DUT");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::ProductName::Id, true,
                                 chip::NullOptional);
        }
        case 15: {
            LogStep(15, "TH reads ProductID from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::ProductID::Id, true,
                                 chip::NullOptional);
        }
        case 16: {
            LogStep(16, "TH writes ProductID from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint16_t value;
            value = 17697U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::ProductID::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "TH reads ProductID from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::ProductID::Id, true,
                                 chip::NullOptional);
        }
        case 18: {
            LogStep(18, "TH reads NodeLabel from the DUT");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::NodeLabel::Id, true,
                                 chip::NullOptional);
        }
        case 19: {
            LogStep(19, "TH writes NodeLabel from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("newnodegarbage: not in length on purpose", 7);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::NodeLabel::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "TH reads NodeLabel from the DUT");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::NodeLabel::Id, true,
                                 chip::NullOptional);
        }
        case 21: {
            LogStep(21, "TH reads Location from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::Location::Id, true,
                                 chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Verify that the Location is same as CountryCode value saved from step1");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && BINFO.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 23: {
            LogStep(23, "TH write Location from the DUT");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("ingarbage: not in length on purpose", 2);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::Location::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 24: {
            LogStep(24, "TH reads Location from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::Location::Id, true,
                                 chip::NullOptional);
        }
        case 25: {
            LogStep(25, "TH reads HardwareVersion from the DUT");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::HardwareVersion::Id, true,
                                 chip::NullOptional);
        }
        case 26: {
            LogStep(26, "TH writes HardwareVersion from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint16_t value;
            value = 17713U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::HardwareVersion::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 27: {
            LogStep(27, "TH reads HardwareVersion from the DUT");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::HardwareVersion::Id, true,
                                 chip::NullOptional);
        }
        case 28: {
            LogStep(28, "TH reads HardwareVersionString from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::HardwareVersionString::Id, true,
                                 chip::NullOptional);
        }
        case 29: {
            LogStep(29, "TH writes HardwareVersionString from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("newhardwareversiongarbage: not in length on purpose", 18);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::HardwareVersionString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 30: {
            LogStep(30, "TH reads HardwareVersionString from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::HardwareVersionString::Id, true,
                                 chip::NullOptional);
        }
        case 31: {
            LogStep(31, "TH reads SoftwareVersion from the DUT");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0009"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::SoftwareVersion::Id, true,
                                 chip::NullOptional);
        }
        case 32: {
            LogStep(32,
                    "Verify that the SoftwareVersion is not displayed to the end-user through any device specific means (ex: "
                    "screen, audio)");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && BINFO.S.A0009"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 33: {
            LogStep(33, "TH writes SoftwareVersion from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0009"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint32_t value;
            value = 33299UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::SoftwareVersion::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 34: {
            LogStep(34, "TH reads SoftwareVersion from the DUT");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0009"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::SoftwareVersion::Id, true,
                                 chip::NullOptional);
        }
        case 35: {
            LogStep(35, "TH reads SoftwareVersionString from the DUT");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::SoftwareVersionString::Id, true,
                                 chip::NullOptional);
        }
        case 36: {
            LogStep(36, "TH writes SoftwareVersionString from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("1.0garbage: not in length on purpose", 3);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::SoftwareVersionString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 37: {
            LogStep(37, "TH reads SoftwareVersionString from the DUT");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::SoftwareVersionString::Id, true,
                                 chip::NullOptional);
        }
        case 38: {
            LogStep(38, "TH reads ManufacturingDate from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::ManufacturingDate::Id, true,
                                 chip::NullOptional);
        }
        case 39: {
            LogStep(39, "Verify if the first 8 characters specify date according to ISO 8601, i.e, YYYYMMDD");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && BINFO.S.A000b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 40: {
            LogStep(40, "TH writes ManufacturingDate from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("20210814789452INgarbage: not in length on purpose", 16);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::ManufacturingDate::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 41: {
            LogStep(41, "TH reads ManufacturingDate from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::ManufacturingDate::Id, true,
                                 chip::NullOptional);
        }
        case 42: {
            LogStep(42, "TH reads PartNumber from the DUT");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::PartNumber::Id, true,
                                 chip::NullOptional);
        }
        case 43: {
            LogStep(43, "TH writes PartNumber from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("newpartgarbage: not in length on purpose", 7);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::PartNumber::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 44: {
            LogStep(44, "TH reads PartNumber from the DUT");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::PartNumber::Id, true,
                                 chip::NullOptional);
        }
        case 45: {
            LogStep(45, "TH reads ProductURL from the DUT");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000d"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::ProductURL::Id, true,
                                 chip::NullOptional);
        }
        case 46: {
            LogStep(46,
                    "Verify that it specifies a link to a specific web page, Verify that it follows the syntax rules specified in "
                    "RFC 3986.");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && BINFO.S.A000d"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 47: {
            LogStep(47, "TH writes ProductURL from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000d"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("https://www.example.comgarbage: not in length on purpose", 23);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::ProductURL::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 48: {
            LogStep(48, "TH reads ProductURL from the DUT");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000d"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::ProductURL::Id, true,
                                 chip::NullOptional);
        }
        case 49: {
            LogStep(49, "TH reads ProductLabel from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::ProductLabel::Id, true,
                                 chip::NullOptional);
        }
        case 50: {
            LogStep(50, "Verify that it does not include the name of the vendor as defined within the VendorName attribute");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && BINFO.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 51: {
            LogStep(51, "TH writes ProductLabel from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("newproductlabelgarbage: not in length on purpose", 15);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::ProductLabel::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 52: {
            LogStep(52, "TH reads ProductLabel from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::ProductLabel::Id, true,
                                 chip::NullOptional);
        }
        case 53: {
            LogStep(53, "TH reads SerialNumber from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::SerialNumber::Id, true,
                                 chip::NullOptional);
        }
        case 54: {
            LogStep(54, "TH writes SerialNumber from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("newserialnumbergarbage: not in length on purpose", 15);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::SerialNumber::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 55: {
            LogStep(55, "TH reads SerialNumber from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::SerialNumber::Id, true,
                                 chip::NullOptional);
        }
        case 56: {
            LogStep(56, "TH reads LocalConfigDisabled from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::LocalConfigDisabled::Id, true,
                                 chip::NullOptional);
        }
        case 57: {
            LogStep(57, "TH sets LocalConfigDisabled to True");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            bool value;
            value = true;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::LocalConfigDisabled::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 58: {
            LogStep(58, "TH reads LocalConfigDisabled from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::LocalConfigDisabled::Id, true,
                                 chip::NullOptional);
        }
        case 59: {
            LogStep(59, "TH reads Reachable from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::Reachable::Id, true,
                                 chip::NullOptional);
        }
        case 60: {
            LogStep(60, "TH sends Write request message to DUT to change value of Reachable to false");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            bool value;
            value = false;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::Reachable::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 61: {
            LogStep(61, "TH reads Reachable from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::Reachable::Id, true,
                                 chip::NullOptional);
        }
        case 62: {
            LogStep(62, "TH reads UniqueID from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::UniqueID::Id, true,
                                 chip::NullOptional);
        }
        case 63: {
            LogStep(63, "TH writes UniqueID from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("newidgarbage: not in length on purpose", 5);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::UniqueID::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 64: {
            LogStep(64, "TH reads UniqueID from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::UniqueID::Id, true,
                                 chip::NullOptional);
        }
        case 65: {
            LogStep(65, "TH reads CapabilityMinima attribute from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0013"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::CapabilityMinima::Id, true,
                                 chip::NullOptional);
        }
        case 66: {
            LogStep(66, "TH writes CapabilityMinima from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0013"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Basic::Structs::CapabilityMinimaStruct::Type value;

            value.caseSessionsPerFabric  = 4U;
            value.subscriptionsPerFabric = 4U;

            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::CapabilityMinima::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 67: {
            LogStep(67, "TH reads CapabilityMinima attribute from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0013"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::CapabilityMinima::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CNET_1_3Suite : public TestCommand
{
public:
    Test_TC_CNET_1_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CNET_1_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CNET_1_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DESC_1_1Suite : public TestCommand
{
public:
    Test_TC_DESC_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DESC_1_1", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DESC_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Descriptor::Id, Descriptor::Attributes::ClusterRevision::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Descriptor::Id, Descriptor::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Descriptor::Id, Descriptor::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Descriptor::Id, Descriptor::Attributes::AcceptedCommandList::Id,
                                 true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Descriptor::Id, Descriptor::Attributes::GeneratedCommandList::Id,
                                 true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DLOG_1_1Suite : public TestCommand
{
public:
    Test_TC_DLOG_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DLOG_1_1", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DLOG_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acceptedCommandList", iter_0, 0));
                    VerifyOrReturn(CheckValue("acceptedCommandList[0]", iter_0.GetValue(), 0UL));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 1));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("generatedCommandList", iter_0, 0));
                    VerifyOrReturn(CheckValue("generatedCommandList[0]", iter_0.GetValue(), 1UL));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 1));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH reads the ClusterRevision from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), DiagnosticLogs::Id,
                                 DiagnosticLogs::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads the FeatureMap from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), DiagnosticLogs::Id, DiagnosticLogs::Attributes::FeatureMap::Id,
                                 true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH reads AttributeList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), DiagnosticLogs::Id, DiagnosticLogs::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads AcceptedCommandList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), DiagnosticLogs::Id,
                                 DiagnosticLogs::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads GeneratedCommandList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), DiagnosticLogs::Id,
                                 DiagnosticLogs::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGETH_1_1Suite : public TestCommand
{
public:
    Test_TC_DGETH_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGETH_1_1", 18, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGETH_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 2UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 6UL));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 7UL));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 8UL));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH reads the ClusterRevision from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads the FeatureMap from DUT");
            VerifyOrDo(!ShouldSkip(" !DGETH.S.F00 && !DGETH.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Given DGETH.S.F00 ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("DGETH.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Given DGETH.S.F01 ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("DGETH.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads AttributeList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH reads optional attribute(PHYRate) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH reads optional attribute(FullDuplex) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH reads optional attribute(PacketRxCount) and Feature dependent(DGETH.S.F00(PKTCNT)) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "TH reads optional attribute(PacketRxCount) and Feature dependent(DGETH.S.F00(PKTCNT)) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "TH reads optional attribute(PacketRxCount) and Feature dependent(DGETH.S.F01(ERRCNT)) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "TH reads optional attribute(PacketRxCount) and Feature dependent(DGETH.S.F01(ERRCNT)) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "TH reads optional attribute(PacketRxCount) and Feature dependent(DGETH.S.F01(ERRCNT)) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "TH reads optional attribute(CarrierDetect) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "TH reads optional attribute(TimeSinceReset) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "TH reads AcceptedCommandList from DUT");
            VerifyOrDo(!ShouldSkip("DGETH.S.F00 || DGETH.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "TH reads AcceptedCommandList from DUT");
            VerifyOrDo(!ShouldSkip(" !DGETH.S.F00 && !DGETH.S.F01 "), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "TH reads GeneratedCommandList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGETH_2_1Suite : public TestCommand
{
public:
    Test_TC_DGETH_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGETH_2_1", 17, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGETH_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::EthernetNetworkDiagnostics::PHYRateType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<bool> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "boolean", "boolean"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int64u", "int64u"));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int64u", "int64u"));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int64u", "int64u"));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int64u", "int64u"));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int64u", "int64u"));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<bool> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "boolean", "boolean"));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int64u", "int64u"));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read PHYRate attribute constraints");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::PHYRate::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read FullDuplex attribute constraints");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::FullDuplex::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read PacketRxCount attribute constraints");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::PacketRxCount::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read PacketRxCount value from DUT and verify the number of packets received on ethernet network interface");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DGETH.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "Read PacketTxCount attribute constraints");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::PacketTxCount::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read PacketTxCount value from DUT and verify the number of packets received on ethernet network interface");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DGETH.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "Read TxErrCount attribute constraints");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::TxErrCount::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8,
                    "Read TxErrCount value from DUT and verify value indicates the number of failed packet transmission on "
                    "ethernet network interface");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DGETH.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "Read CollisionCount attribute constraints");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::CollisionCount::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10,
                    "Read CollisionCount value from DUT and verify value indicates the number of collision occurred while "
                    "transmitting packets on ethernet network interface");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DGETH.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 11: {
            LogStep(11, "Read OverrunCount attribute constraints");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::OverrunCount::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12,
                    "Read OverrunCount value from DUT and verify value indicates the number of packets dropped due to lack of "
                    "buffer memory on ethernet network interface");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DGETH.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "Read CarrierDetect attribute constraints");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::CarrierDetect::Id, true, chip::NullOptional);
        }
        case 14: {
            LogStep(14,
                    "Read CarrierDetect value from DUT and verify value indicates the presence of carrier detect control signal on "
                    "ethernet network interface");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DGETH.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 15: {
            LogStep(15, "Read TimeSinceReset attribute constraints");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::TimeSinceReset::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Read TimeSinceReset value from DUT and verify the value indicates the duration of time, in minutes");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DGETH.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGETH_2_2Suite : public TestCommand
{
public:
    Test_TC_DGETH_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGETH_2_2", 22, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGETH_2_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    uint64_t PacketRxCount;
    uint64_t PacketTxCount;
    uint64_t TxErrCount;
    uint64_t CollisionCount;
    uint64_t OverrunCount;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::EthernetNetworkDiagnostics::PHYRateType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::EthernetNetworkDiagnostics::PHYRateType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::EthernetNetworkDiagnostics::PHYRateType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::EthernetNetworkDiagnostics::PHYRateType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::EthernetNetworkDiagnostics::PHYRateType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::EthernetNetworkDiagnostics::PHYRateType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::EthernetNetworkDiagnostics::PHYRateType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::EthernetNetworkDiagnostics::PHYRateType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::EthernetNetworkDiagnostics::PHYRateType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::EthernetNetworkDiagnostics::PHYRateType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                PacketRxCount = value;
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                PacketTxCount = value;
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                TxErrCount = value;
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                CollisionCount = value;
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                OverrunCount = value;
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, PacketRxCount));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, PacketTxCount));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, TxErrCount));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, CollisionCount));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, OverrunCount));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH reads PHYRate attribute from DUT");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::PHYRate::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads PHYRate attribute from DUT");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::PHYRate::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH reads PHYRate attribute from DUT");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::PHYRate::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads PHYRate attribute from DUT");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::PHYRate::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads PHYRate attribute from DUT");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::PHYRate::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH reads PHYRate attribute from DUT");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::PHYRate::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH reads PHYRate attribute from DUT");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::PHYRate::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH reads PHYRate attribute from DUT");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::PHYRate::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "TH reads PHYRate attribute from DUT");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::PHYRate::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "TH reads PHYRate attribute from DUT");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::PHYRate::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "TH reads PacketRxCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::PacketRxCount::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "TH reads PacketTxCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::PacketTxCount::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "TH reads TxErrCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::TxErrCount::Id, true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "TH reads CollisionCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::CollisionCount::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "TH reads OverrunCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::OverrunCount::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Sends ResetCounts command");
            VerifyOrDo(!ShouldSkip("DGETH.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::EthernetNetworkDiagnostics::Commands::ResetCounts::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                               EthernetNetworkDiagnostics::Commands::ResetCounts::Id, value, chip::NullOptional

            );
        }
        case 17: {
            LogStep(17, "TH reads PacketRxCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::PacketRxCount::Id, true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "TH reads PacketTxCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::PacketTxCount::Id, true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "TH reads TxErrCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::TxErrCount::Id, true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "TH reads CollisionCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::CollisionCount::Id, true, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "TH reads OverrunCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::OverrunCount::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_FLW_1_1Suite : public TestCommand
{
public:
    Test_TC_FLW_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_FLW_1_1", 7, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_FLW_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 3U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FlowMeasurement::Id,
                                 FlowMeasurement::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FlowMeasurement::Id, FlowMeasurement::Attributes::FeatureMap::Id,
                                 true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FlowMeasurement::Id,
                                 FlowMeasurement::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the optional attribute(Tolerance) in AttributeList");
            VerifyOrDo(!ShouldSkip("FLW.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FlowMeasurement::Id,
                                 FlowMeasurement::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FlowMeasurement::Id,
                                 FlowMeasurement::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FlowMeasurement::Id,
                                 FlowMeasurement::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_FLW_2_1Suite : public TestCommand
{
public:
    Test_TC_FLW_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_FLW_2_1", 5, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_FLW_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65533U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65534U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2048U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read the mandatory attribute: MinMeasuredValue");
            VerifyOrDo(!ShouldSkip("FLW.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FlowMeasurement::Id,
                                 FlowMeasurement::Attributes::MinMeasuredValue::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the mandatory attribute: MaxMeasuredValue");
            VerifyOrDo(!ShouldSkip("FLW.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FlowMeasurement::Id,
                                 FlowMeasurement::Attributes::MaxMeasuredValue::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the mandatory attribute: MeasuredValue");
            VerifyOrDo(!ShouldSkip("FLW.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FlowMeasurement::Id,
                                 FlowMeasurement::Attributes::MeasuredValue::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads from the DUT the Tolerance attribute");
            VerifyOrDo(!ShouldSkip("FLW.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FlowMeasurement::Id, FlowMeasurement::Attributes::Tolerance::Id,
                                 true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_FLABEL_1_1Suite : public TestCommand
{
public:
    Test_TC_FLABEL_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_FLABEL_1_1", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_FLABEL_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH reads the ClusterRevision from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FixedLabel::Id, FixedLabel::Attributes::ClusterRevision::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads the FeatureMap from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FixedLabel::Id, FixedLabel::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH reads AttributeList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FixedLabel::Id, FixedLabel::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads AcceptedCommandList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FixedLabel::Id, FixedLabel::Attributes::AcceptedCommandList::Id,
                                 true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads GeneratedCommandList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FixedLabel::Id, FixedLabel::Attributes::GeneratedCommandList::Id,
                                 true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_FLABEL_2_1Suite : public TestCommand
{
public:
    Test_TC_FLABEL_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_FLABEL_2_1", 4, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_FLABEL_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::FixedLabel::Structs::LabelStruct::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH reads LabelList from the DUT");
            VerifyOrDo(!ShouldSkip("FLABEL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FixedLabel::Id, FixedLabel::Attributes::LabelList::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH tries to write LabelList attribute of the DUT by setting Label = Test_Label, Value= Test_Value");
            VerifyOrDo(!ShouldSkip("FLABEL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::FixedLabel::Structs::LabelStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::FixedLabel::Structs::LabelStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].label = chip::Span<const char>("Test_Labelgarbage: not in length on purpose", 10);
                listHolder_0->mList[0].value = chip::Span<const char>("Test_Valuegarbage: not in length on purpose", 10);

                value =
                    chip::app::DataModel::List<chip::app::Clusters::FixedLabel::Structs::LabelStruct::Type>(listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), FixedLabel::Id, FixedLabel::Attributes::LabelList::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH reads LabelList from the DUT");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && FLABEL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CGEN_1_1Suite : public TestCommand
{
public:
    Test_TC_CGEN_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CGEN_1_1", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CGEN_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CGEN_2_1Suite : public TestCommand
{
public:
    Test_TC_CGEN_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CGEN_2_1", 8, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CGEN_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int64u", "int64u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("breadcrumb", value, 1ULL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::GeneralCommissioning::RegulatoryLocationType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::GeneralCommissioning::RegulatoryLocationType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::GeneralCommissioning::Structs::BasicCommissioningInfo::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "boolean", "boolean"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH1 reads the BreadCrumb Attribute from the DUT");
            VerifyOrDo(!ShouldSkip("CGEN.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::Breadcrumb::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH1 writes the BreadCrumb attribute as 1 to the DUT");
            VerifyOrDo(!ShouldSkip("CGEN.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint64_t value;
            value = 1ULL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                  GeneralCommissioning::Attributes::Breadcrumb::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH1 reads the BreadCrumb attribute from the DUT");
            VerifyOrDo(!ShouldSkip("CGEN.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::Breadcrumb::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH1 reads the RegulatoryConfig attribute from the DUT");
            VerifyOrDo(!ShouldSkip("CGEN.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::RegulatoryConfig::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH1 reads the LocationCapability attribute from the DUT");
            VerifyOrDo(!ShouldSkip("CGEN.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::LocationCapability::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6,
                    "TH1 reads BasicCommissioningInfo attribute from DUT and Verify that the BasicCommissioningInfo attribute has "
                    "the following field: FailSafeExpiryLengthSeconds field value is within a duration range of 0 to 65535");
            VerifyOrDo(!ShouldSkip("CGEN.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::BasicCommissioningInfo::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH1 reads SupportsConcurrentConnection attribute from the DUT");
            VerifyOrDo(!ShouldSkip("CGEN.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::SupportsConcurrentConnection::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGGEN_1_1Suite : public TestCommand
{
public:
    Test_TC_DGGEN_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGGEN_1_1", 12, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGGEN_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 8UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 6UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 7UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralDiagnostics::Id,
                                 GeneralDiagnostics::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralDiagnostics::Id,
                                 GeneralDiagnostics::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralDiagnostics::Id,
                                 GeneralDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read optional attribute(UpTime) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGGEN.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralDiagnostics::Id,
                                 GeneralDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read optional attribute(TotalOperationalHours) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGGEN.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralDiagnostics::Id,
                                 GeneralDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read optional attribute(BootReason) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGGEN.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralDiagnostics::Id,
                                 GeneralDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read optional attribute(ActiveHardwareFaults) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGGEN.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralDiagnostics::Id,
                                 GeneralDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read optional attribute(ActiveRadioFaults) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGGEN.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralDiagnostics::Id,
                                 GeneralDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Read optional attribute(ActiveNetworkFaults) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGGEN.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralDiagnostics::Id,
                                 GeneralDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralDiagnostics::Id,
                                 GeneralDiagnostics::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralDiagnostics::Id,
                                 GeneralDiagnostics::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGGEN_2_1Suite : public TestCommand
{
public:
    Test_TC_DGGEN_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGGEN_2_1", 18, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGGEN_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::GeneralDiagnostics::Structs::NetworkInterfaceType::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int64u", "int64u"));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967294UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 6U));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH reads NetworkInterfaces structure attribute from DUT.");
            VerifyOrDo(!ShouldSkip("DGGEN.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralDiagnostics::Id,
                                 GeneralDiagnostics::Attributes::NetworkInterfaces::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads a RebootCount attribute value from DUT.");
            VerifyOrDo(!ShouldSkip("DGGEN.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralDiagnostics::Id,
                                 GeneralDiagnostics::Attributes::RebootCount::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Reboot target device");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
            return Reboot(kIdentityAlpha, value);
        }
        case 4: {
            LogStep(4, "Reboot target device(DUT)");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Please reboot the DUT and enter 'y' after DUT startsgarbage: not in length on purpose", 52);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "Reboot target device");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
            return Reboot(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6, "Reboot target device(DUT)");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Please reboot the DUT and enter 'y' after DUT startsgarbage: not in length on purpose", 52);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 8: {
            LogStep(8,
                    "DUT reboots and TH reads a UpTime attribute value of DUT since some arbitrary start time of DUT rebooting.");
            VerifyOrDo(!ShouldSkip("DGGEN.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralDiagnostics::Id, GeneralDiagnostics::Attributes::UpTime::Id,
                                 true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "TH reads a TotalOperationalHours attribute value from DUT.");
            VerifyOrDo(!ShouldSkip("DGGEN.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralDiagnostics::Id,
                                 GeneralDiagnostics::Attributes::TotalOperationalHours::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Reboot target device");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
            return Reboot(kIdentityAlpha, value);
        }
        case 11: {
            LogStep(11, "Reboot target device(DUT)");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Please reboot the DUT and enter 'y' after DUT startsgarbage: not in length on purpose", 52);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 12: {
            LogStep(12, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "TH reads BootReason attribute value from DUT.");
            VerifyOrDo(!ShouldSkip("DGGEN.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralDiagnostics::Id,
                                 GeneralDiagnostics::Attributes::BootReasons::Id, true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "TH reads ActiveHardwareFaults attribute value from DUT.");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DGGEN.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 15: {
            LogStep(15, "TH reads ActiveRadioFaults attribute value from DUT.");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DGGEN.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 16: {
            LogStep(16, "TH reads ActiveNetworkFaults attribute value from DUT.");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DGGEN.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17, "TH reads TestEventTriggersEnabled attribute value");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DGGEN.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_I_1_1Suite : public TestCommand
{
public:
    Test_TC_I_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_I_1_1", 7, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_I_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 4U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 64UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH reads the ClusterRevision attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Attributes::ClusterRevision::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads the FeatureMap attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the optional command(TriggerEffect) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("I.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Attributes::GeneratedCommandList::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_I_2_1Suite : public TestCommand
{
public:
    Test_TC_I_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_I_2_1", 3, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_I_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 5U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH reads the IdentifyTime attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Attributes::IdentifyTime::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads the IdentifyType attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Attributes::IdentifyType::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_I_2_2Suite : public TestCommand
{
public:
    Test_TC_I_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_I_2_2", 11, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_I_2_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 51U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 69U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 42U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 58U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("identifyTime", value, 0U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 5U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 15U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH sends Identify command to DUT, with the identify time field set to 0x003c (60s).");
            VerifyOrDo(!ShouldSkip("I.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Identify::Commands::Identify::Type value;
            value.identifyTime = 60U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Commands::Identify::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "TH reads immediately IdentifyTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("I.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Attributes::IdentifyTime::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Wait 10000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 4: {
            LogStep(4, "After 10 seconds, the TH reads IdentifyTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("I.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Attributes::IdentifyTime::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5,
                    "TH sends IdentifyQuery command to DUT and Verify IdentifyQueryResponse command to TH,with the Timeout field "
                    "set to a value in the range 0x0000 to 0x0032");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && I.S.C01.Rsp && I.S.C00.Tx"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6, "TH sends Identify command to DUT, with the identify time field set to 0x0000 (stop identifying).");
            VerifyOrDo(!ShouldSkip("I.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Identify::Commands::Identify::Type value;
            value.identifyTime = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Commands::Identify::Id, value,
                               chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "TH reads immediately IdentifyTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("I.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Attributes::IdentifyTime::Id, true,
                                 chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH writes a value of 0x000f (15s) to IdentifyTime attribute of DUT");
            VerifyOrDo(!ShouldSkip("I.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint16_t value;
            value = 15U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Attributes::IdentifyTime::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Wait 5000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "After 5 seconds, the TH reads IdentifyTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("I.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Attributes::IdentifyTime::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_I_2_3Suite : public TestCommand
{
public:
    Test_TC_I_2_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_I_2_3", 21, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_I_2_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "1.Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1,
                    "TH sends TriggerEffect command to DUT with the effect identifier field set to 0x00 blink and the effect "
                    "variant field set to 0x00 default");
            VerifyOrDo(!ShouldSkip("I.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Identify::Commands::TriggerEffect::Type value;
            value.effectIdentifier = static_cast<chip::app::Clusters::Identify::IdentifyEffectIdentifier>(0);
            value.effectVariant    = static_cast<chip::app::Clusters::Identify::IdentifyEffectVariant>(0);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Commands::TriggerEffect::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "DUT executes a blink effect");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && I.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3,
                    "TH sends TriggerEffect command to DUT with the effect identifier field set to 0x01 breathe and the effect "
                    "variant field set to 0x00 default");
            VerifyOrDo(!ShouldSkip("I.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Identify::Commands::TriggerEffect::Type value;
            value.effectIdentifier = static_cast<chip::app::Clusters::Identify::IdentifyEffectIdentifier>(1);
            value.effectVariant    = static_cast<chip::app::Clusters::Identify::IdentifyEffectVariant>(0);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Commands::TriggerEffect::Id, value,
                               chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "DUT executes a breathe effect");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && I.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5,
                    "TH sends TriggerEffect command to DUT with the effect identifier field set to 0x02 okay and the effect "
                    "variant field set to 0x00 default");
            VerifyOrDo(!ShouldSkip("I.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Identify::Commands::TriggerEffect::Type value;
            value.effectIdentifier = static_cast<chip::app::Clusters::Identify::IdentifyEffectIdentifier>(2);
            value.effectVariant    = static_cast<chip::app::Clusters::Identify::IdentifyEffectVariant>(0);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Commands::TriggerEffect::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "DUT executes an okay effect");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && I.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7,
                    "TH sends TriggerEffect command to DUT with the effect identifier field set to 0x0b channel change and the "
                    "effect variant field set to 0x00 default");
            VerifyOrDo(!ShouldSkip("I.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Identify::Commands::TriggerEffect::Type value;
            value.effectIdentifier = static_cast<chip::app::Clusters::Identify::IdentifyEffectIdentifier>(11);
            value.effectVariant    = static_cast<chip::app::Clusters::Identify::IdentifyEffectVariant>(0);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Commands::TriggerEffect::Id, value,
                               chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "DUT executes a channel change effect");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && I.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9,
                    "TH sends TriggerEffect command to DUT with the effect identifier field set to 0x01 breathe and the effect "
                    "variant field set to 0x00 default");
            VerifyOrDo(!ShouldSkip("I.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Identify::Commands::TriggerEffect::Type value;
            value.effectIdentifier = static_cast<chip::app::Clusters::Identify::IdentifyEffectIdentifier>(1);
            value.effectVariant    = static_cast<chip::app::Clusters::Identify::IdentifyEffectVariant>(0);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Commands::TriggerEffect::Id, value,
                               chip::NullOptional

            );
        }
        case 10: {
            LogStep(10, "DUT executes a breathe effect");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && I.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 11: {
            LogStep(11,
                    "TH sends TriggerEffect command to DUT with the effect identifier field set to 0xfe finish effect and the "
                    "effect variant field set to 0x00 default");
            VerifyOrDo(!ShouldSkip("I.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Identify::Commands::TriggerEffect::Type value;
            value.effectIdentifier = static_cast<chip::app::Clusters::Identify::IdentifyEffectIdentifier>(254);
            value.effectVariant    = static_cast<chip::app::Clusters::Identify::IdentifyEffectVariant>(0);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Commands::TriggerEffect::Id, value,
                               chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "DUT stops the breathe effect after the current effect sequence");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && I.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13,
                    "TH sends TriggerEffect command to DUT with the effect identifier field set to 0x01 breathe and the effect "
                    "variant field set to 0x00 default");
            VerifyOrDo(!ShouldSkip("I.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Identify::Commands::TriggerEffect::Type value;
            value.effectIdentifier = static_cast<chip::app::Clusters::Identify::IdentifyEffectIdentifier>(1);
            value.effectVariant    = static_cast<chip::app::Clusters::Identify::IdentifyEffectVariant>(0);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Commands::TriggerEffect::Id, value,
                               chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "DUT executes a breathe effect");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && I.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 15: {
            LogStep(15,
                    "TH sends TriggerEffect command to DUT with the effect identifier field set to 0xff stop effect and the effect "
                    "variant field set to 0x00 default");
            VerifyOrDo(!ShouldSkip("I.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Identify::Commands::TriggerEffect::Type value;
            value.effectIdentifier = static_cast<chip::app::Clusters::Identify::IdentifyEffectIdentifier>(255);
            value.effectVariant    = static_cast<chip::app::Clusters::Identify::IdentifyEffectVariant>(0);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Commands::TriggerEffect::Id, value,
                               chip::NullOptional

            );
        }
        case 16: {
            LogStep(16, "DUT stops the breathe effect as soon as possible.");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && I.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17,
                    "TH sends TriggerEffect command to DUT with the effect identifier field set to 0x00 blink and the effect "
                    "variant field set to 0x42 unknown");
            VerifyOrDo(!ShouldSkip("I.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Identify::Commands::TriggerEffect::Type value;
            value.effectIdentifier = static_cast<chip::app::Clusters::Identify::IdentifyEffectIdentifier>(0);
            value.effectVariant    = static_cast<chip::app::Clusters::Identify::IdentifyEffectVariant>(66);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Commands::TriggerEffect::Id, value,
                               chip::NullOptional

            );
        }
        case 18: {
            LogStep(18, "Check DUT executes a blink effect.");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && I.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 19: {
            LogStep(19,
                    "TH sends TriggerEffect command to DUT with the effect identifier field set to 0xff stop effect and the effect "
                    "variant field set to 0x00 default");
            VerifyOrDo(!ShouldSkip("I.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Identify::Commands::TriggerEffect::Type value;
            value.effectIdentifier = static_cast<chip::app::Clusters::Identify::IdentifyEffectIdentifier>(255);
            value.effectVariant    = static_cast<chip::app::Clusters::Identify::IdentifyEffectVariant>(0);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Commands::TriggerEffect::Id, value,
                               chip::NullOptional

            );
        }
        case 20: {
            LogStep(20, "DUT stops any effect that may be still running as soon as possible");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && I.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ILL_1_1Suite : public TestCommand
{
public:
    Test_TC_ILL_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ILL_1_1", 8, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ILL_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 3U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), IlluminanceMeasurement::Id,
                                 IlluminanceMeasurement::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), IlluminanceMeasurement::Id,
                                 IlluminanceMeasurement::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), IlluminanceMeasurement::Id,
                                 IlluminanceMeasurement::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the optional attribute(Tolerance) in AttributeList");
            VerifyOrDo(!ShouldSkip("ILL.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), IlluminanceMeasurement::Id,
                                 IlluminanceMeasurement::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the optional attribute(LightSensorType) in AttributeList");
            VerifyOrDo(!ShouldSkip("ILL.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), IlluminanceMeasurement::Id,
                                 IlluminanceMeasurement::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), IlluminanceMeasurement::Id,
                                 IlluminanceMeasurement::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), IlluminanceMeasurement::Id,
                                 IlluminanceMeasurement::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ILL_2_1Suite : public TestCommand
{
public:
    Test_TC_ILL_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ILL_2_1", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ILL_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65533U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 2U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65534U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65534U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2048U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH reads MinMeasuredValue attribute from DUT");
            VerifyOrDo(!ShouldSkip("ILL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), IlluminanceMeasurement::Id,
                                 IlluminanceMeasurement::Attributes::MinMeasuredValue::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads MaxMeasuredValue attribute from DUT");
            VerifyOrDo(!ShouldSkip("ILL.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), IlluminanceMeasurement::Id,
                                 IlluminanceMeasurement::Attributes::MaxMeasuredValue::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH reads MeasuredValue attribute from DUT");
            VerifyOrDo(!ShouldSkip("ILL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), IlluminanceMeasurement::Id,
                                 IlluminanceMeasurement::Attributes::MeasuredValue::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads Tolerance attribute from DUT");
            VerifyOrDo(!ShouldSkip("ILL.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), IlluminanceMeasurement::Id,
                                 IlluminanceMeasurement::Attributes::Tolerance::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads LightSensorType attribute from DUT");
            VerifyOrDo(!ShouldSkip("ILL.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), IlluminanceMeasurement::Id,
                                 IlluminanceMeasurement::Attributes::LightSensorType::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ILL_2_2Suite : public TestCommand
{
public:
    Test_TC_ILL_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ILL_2_2", 9, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ILL_2_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::app::DataModel::Nullable<uint16_t> MinMeasuredValue;
    chip::app::DataModel::Nullable<uint16_t> MaxMeasuredValue;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                MinMeasuredValue = value;
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                MaxMeasuredValue = value;
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65534U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH reads MinMeasuredValue attribute from DUT");
            VerifyOrDo(!ShouldSkip("ILL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), IlluminanceMeasurement::Id,
                                 IlluminanceMeasurement::Attributes::MinMeasuredValue::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads MaxMeasuredValue attribute from DUT");
            VerifyOrDo(!ShouldSkip("ILL.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), IlluminanceMeasurement::Id,
                                 IlluminanceMeasurement::Attributes::MaxMeasuredValue::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Cover the sensor or darken the room");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for Successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 4: {
            LogStep(4, "Wait 1s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "After a few seconds, TH reads MeasuredValue attribute from DUT.");
            VerifyOrDo(!ShouldSkip("ILL.S.A0000 && PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), IlluminanceMeasurement::Id,
                                 IlluminanceMeasurement::Attributes::MeasuredValue::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Expose the sensor again to light");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for Successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "Wait 1s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 8: {
            LogStep(8, "After a few seconds, TH reads MeasuredValue attribute from DUT.");
            VerifyOrDo(!ShouldSkip("ILL.S.A0000 && PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), IlluminanceMeasurement::Id,
                                 IlluminanceMeasurement::Attributes::MeasuredValue::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_LVL_1_1Suite : public TestCommand
{
public:
    Test_TC_LVL_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LVL_1_1", 18, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_LVL_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 5U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 2UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 4UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 15UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 17UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 16384UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 6UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 16UL));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 18UL));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 19UL));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 20UL));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 6UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 7UL));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 8UL));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::ClusterRevision::Id,
                                 true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            VerifyOrDo(!ShouldSkip(" !LVL.S.F00 && !LVL.S.F01 && !LVL.S.F02 "), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Given LVL.S.F00(OO) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("LVL.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Given LVL.S.F01(LT) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("LVL.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Given LVL.S.F02(FQ) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("LVL.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read the optional attribute(StartUpCurrentLevel and RemainingTime) in AttributeList");
            VerifyOrDo(!ShouldSkip("LVL.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read the optional attribute(CurrentFrequency, MinFrequency and MinFrequency) in AttributeList");
            VerifyOrDo(!ShouldSkip("LVL.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Read the optional attribute(MinLevel) in AttributeList");
            VerifyOrDo(!ShouldSkip("LVL.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Read the optional attribute(MaxLevel) in AttributeList");
            VerifyOrDo(!ShouldSkip("LVL.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Read the optional attribute(OnOffTransitionTime) in AttributeList");
            VerifyOrDo(!ShouldSkip("LVL.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Read the optional attribute(OnTransitionTime) in AttributeList");
            VerifyOrDo(!ShouldSkip("LVL.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Read the optional attribute(OffTransitionTime) in AttributeList");
            VerifyOrDo(!ShouldSkip("LVL.S.A0013"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Read the optional attribute(DefaultMoveRate) in AttributeList");
            VerifyOrDo(!ShouldSkip("LVL.S.A0014"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id,
                                 LevelControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Read the Feature-dependent(LVL.S.F02) command in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("LVL.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id,
                                 LevelControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id,
                                 LevelControl::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_LVL_2_1Suite : public TestCommand
{
public:
    Test_TC_LVL_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LVL_2_1", 21, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_LVL_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::app::DataModel::Nullable<uint8_t> CurrentLevelValue;
    uint8_t MinLevelValue;
    uint8_t MinLevelFeatureMapNotSupportedValue;
    uint8_t MaxLevelValue;
    uint8_t MaxLevelFeatureMapNotSupportedValue;
    uint16_t MinFrequencyValue;
    uint16_t MaxFrequencyValue;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
                CurrentLevelValue = value;
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("minLevel", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                MinLevelValue = value;
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
                MinLevelFeatureMapNotSupportedValue = value;
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("maxLevel", value, 254U));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, MinLevelValue));
                MaxLevelValue = value;
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, MinLevelFeatureMapNotSupportedValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
                MaxLevelFeatureMapNotSupportedValue = value;
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, MinLevelValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, MaxLevelValue));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, MinLevelFeatureMapNotSupportedValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, MaxLevelFeatureMapNotSupportedValue));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
                MinFrequencyValue = value;
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
                MaxFrequencyValue = value;
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, MinFrequencyValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, MaxFrequencyValue));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, MinLevelValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, MaxLevelValue));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, MinLevelFeatureMapNotSupportedValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, MaxLevelFeatureMapNotSupportedValue));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Reads the CurrentLevel attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Reads the RemainingTime attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::RemainingTime::Id,
                                 true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Reads the MinLevel attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A0002 && LVL.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::MinLevel::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Reads the MinLevel attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A0002 && !LVL.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::MinLevel::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Reads the MaxLevel attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A0003 && LVL.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::MaxLevel::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Reads the MaxLevel attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A0003 && !LVL.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::MaxLevel::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Step 4b & 4C Reads the CurrentLevel attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.F01 && LVL.S.A0002 && LVL.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Step 4b & 4C Reads the CurrentLevel attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A0002 && LVL.S.A0003 && !LVL.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Reads the CurrentFrequency attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentFrequency::Id,
                                 true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Reads the MinFrequency attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::MinFrequency::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Reads the MaxFrequency attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::MaxFrequency::Id, true,
                                 chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Step 7b & 7C Reads the CurrentFrequency attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A0004 && LVL.S.A0005 && LVL.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentFrequency::Id,
                                 true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Reads the OnOffTransitionTime attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id,
                                 LevelControl::Attributes::OnOffTransitionTime::Id, true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Reads the OnLevel attribute ");
            VerifyOrDo(!ShouldSkip("LVL.S.F01 && LVL.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::OnLevel::Id, true,
                                 chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Reads the OnLevel attribute ");
            VerifyOrDo(!ShouldSkip("LVL.S.A0011 && !LVL.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::OnLevel::Id, true,
                                 chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Reads the OnTransitionTime attribute ");
            VerifyOrDo(!ShouldSkip("LVL.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::OnTransitionTime::Id,
                                 true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Reads the OffTransitionTime attribute ");
            VerifyOrDo(!ShouldSkip("LVL.S.A0013"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::OffTransitionTime::Id,
                                 true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Reads the DefaultMoveRate attribute ");
            VerifyOrDo(!ShouldSkip("LVL.S.A0014"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::DefaultMoveRate::Id,
                                 true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Reads the Options attribute ");
            VerifyOrDo(!ShouldSkip("LVL.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::Options::Id, true,
                                 chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Reads the StartUpCurrentLevel attribute ");
            VerifyOrDo(!ShouldSkip("LVL.S.A4000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id,
                                 LevelControl::Attributes::StartUpCurrentLevel::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_LVL_2_2Suite : public TestCommand
{
public:
    Test_TC_LVL_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LVL_2_2", 20, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("OnOffTransitionTimeConfigValue", 0, UINT16_MAX, &mOnOffTransitionTimeConfigValue);
        AddArgument("OnLevelConfigValue", 0, UINT8_MAX, &mOnLevelConfigValue);
        AddArgument("OnTransitionTimeConfigValue", 0, UINT16_MAX, &mOnTransitionTimeConfigValue);
        AddArgument("OffTransitionTimeConfigValue", 0, UINT16_MAX, &mOffTransitionTimeConfigValue);
        AddArgument("DefaultMoveRateConfigValue", 0, UINT8_MAX, &mDefaultMoveRateConfigValue);
        AddArgument("StartUpCurrentLevelConfigValue", 0, UINT8_MAX, &mStartUpCurrentLevelConfigValue);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_LVL_2_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mOnOffTransitionTimeConfigValue;
    chip::Optional<uint8_t> mOnLevelConfigValue;
    chip::Optional<uint16_t> mOnTransitionTimeConfigValue;
    chip::Optional<uint16_t> mOffTransitionTimeConfigValue;
    chip::Optional<uint8_t> mDefaultMoveRateConfigValue;
    chip::Optional<uint8_t> mStartUpCurrentLevelConfigValue;
    chip::Optional<uint16_t> mTimeout;

    uint16_t OnOffTransitionTimeValue;
    chip::app::DataModel::Nullable<uint8_t> OnLevelValue;
    chip::app::DataModel::Nullable<uint16_t> OnTransitionTimeValue;
    chip::app::DataModel::Nullable<uint16_t> OffTransitionTimeValue;
    chip::app::DataModel::Nullable<uint8_t> DefaultMoveRatevalue;
    chip::app::DataModel::Nullable<uint8_t> StartUpCurrentLevelValue;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
                OnOffTransitionTimeValue = value;
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(
                    CheckValue("onOffTransitionTime", value,
                               mOnOffTransitionTimeConfigValue.HasValue() ? mOnOffTransitionTimeConfigValue.Value() : 10U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintNotValue("value", value, OnOffTransitionTimeValue));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
                OnLevelValue = value;
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("onLevel", value));
                VerifyOrReturn(CheckValue("onLevel.Value()", value.Value(),
                                          mOnLevelConfigValue.HasValue() ? mOnLevelConfigValue.Value() : 5U));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintNotValue("value", value, OnLevelValue));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
                OnTransitionTimeValue = value;
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("onTransitionTime", value));
                VerifyOrReturn(CheckValue("onTransitionTime.Value()", value.Value(),
                                          mOnTransitionTimeConfigValue.HasValue() ? mOnTransitionTimeConfigValue.Value() : 5U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintNotValue("value", value, OnTransitionTimeValue));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
                OffTransitionTimeValue = value;
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("offTransitionTime", value));
                VerifyOrReturn(CheckValue("offTransitionTime.Value()", value.Value(),
                                          mOffTransitionTimeConfigValue.HasValue() ? mOffTransitionTimeConfigValue.Value() : 10U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintNotValue("value", value, OffTransitionTimeValue));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
                DefaultMoveRatevalue = value;
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("defaultMoveRate", value));
                VerifyOrReturn(CheckValue("defaultMoveRate.Value()", value.Value(),
                                          mDefaultMoveRateConfigValue.HasValue() ? mDefaultMoveRateConfigValue.Value() : 111U));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintNotValue("value", value, DefaultMoveRatevalue));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
                StartUpCurrentLevelValue = value;
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("startUpCurrentLevel", value));
                VerifyOrReturn(
                    CheckValue("startUpCurrentLevel.Value()", value.Value(),
                               mStartUpCurrentLevelConfigValue.HasValue() ? mStartUpCurrentLevelConfigValue.Value() : 5U));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintNotValue("value", value, StartUpCurrentLevelValue));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Reads the OnOffTransitionTime attribute from the DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id,
                                 LevelControl::Attributes::OnOffTransitionTime::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "writes the OnOffTransitionTime attribute on the DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint16_t value;
            value = mOnOffTransitionTimeConfigValue.HasValue() ? mOnOffTransitionTimeConfigValue.Value() : 10U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id,
                                  LevelControl::Attributes::OnOffTransitionTime::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Reads the OnOffTransitionTime attribute from the DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id,
                                 LevelControl::Attributes::OnOffTransitionTime::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Reads the OnLevel attribute from the DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::OnLevel::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "writes the OnLevel attribute on the DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = mOnLevelConfigValue.HasValue() ? mOnLevelConfigValue.Value() : 5U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::OnLevel::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Reads the OnLevel attribute from the DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::OnLevel::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Reads the OnTransitionTime attribute from the DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::OnTransitionTime::Id,
                                 true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Writes the OnTransitionTime attribute on the DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint16_t> value;
            value.SetNonNull();
            value.Value() = mOnTransitionTimeConfigValue.HasValue() ? mOnTransitionTimeConfigValue.Value() : 5U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::OnTransitionTime::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Reads the OnTransitionTime attribute from the DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::OnTransitionTime::Id,
                                 true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Reads the OffTransitionTime attribute from the DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.A0013"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::OffTransitionTime::Id,
                                 true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Writes the OffTransitionTime attribute on the DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.A0013"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint16_t> value;
            value.SetNonNull();
            value.Value() = mOffTransitionTimeConfigValue.HasValue() ? mOffTransitionTimeConfigValue.Value() : 10U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::OffTransitionTime::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Reads the OffTransitionTime attribute from the DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.A0013"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::OffTransitionTime::Id,
                                 true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Reads the DefaultMoveRate attribute from the DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.A0014"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::DefaultMoveRate::Id,
                                 true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Writes the DefaultMoveRate attribute on the DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.A0014"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = mDefaultMoveRateConfigValue.HasValue() ? mDefaultMoveRateConfigValue.Value() : 111U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::DefaultMoveRate::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Reads the DefaultMoveRate attribute from the DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.A0014"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::DefaultMoveRate::Id,
                                 true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Reads the StartUpCurrentLevel attribute from the DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.A4000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id,
                                 LevelControl::Attributes::StartUpCurrentLevel::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "writes the StartUpCurrentLevel attribute on the DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.A4000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = mStartUpCurrentLevelConfigValue.HasValue() ? mStartUpCurrentLevelConfigValue.Value() : 5U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id,
                                  LevelControl::Attributes::StartUpCurrentLevel::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "reads the StartUpCurrentLevel attribute from the DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.A4000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id,
                                 LevelControl::Attributes::StartUpCurrentLevel::Id, true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "writes back default value of OnOffTransitionTime attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint16_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id,
                                  LevelControl::Attributes::OnOffTransitionTime::Id, value, chip::NullOptional, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_LVL_3_1Suite : public TestCommand
{
public:
    Test_TC_LVL_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LVL_3_1", 46, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_LVL_3_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 50U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 50U));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 85U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 115U));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 127U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 173U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 170U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 200U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 200U));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 200U));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("options", value, 0U));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 100U));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 100U));
            }
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 100U));
            }
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 160U));
            }
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("options", value, 1U));
            }
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 100U));
            }
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 120U));
            }
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 120U));
            }
            break;
        case 44:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 45:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 160U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Precondition Send On Command");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Check on/off attribute value is true after on command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Precondition: write default value of OnOffTransitionTime attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint16_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id,
                                  LevelControl::Attributes::OnOffTransitionTime::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH sends Off command to DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C04.Rsp && OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "TH sends a MoveToLevelWithOnOff command to DUT, with Level =50 and TransitionTime =0 (immediate)");
            VerifyOrDo(!ShouldSkip("LVL.S.C04.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::MoveToLevelWithOnOff::Type value;
            value.level = 50U;
            value.transitionTime.SetNonNull();
            value.transitionTime.Value() = 0U;
            value.optionsMask            = 0U;
            value.optionsOverride        = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevelWithOnOff::Id,
                               value, chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "TH reads OnOff attribute (On/Off cluster) from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && LVL.S.C04.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C04.Rsp && LVL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 9: {
            LogStep(9, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C04.Rsp && OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 10: {
            LogStep(10, "TH sends a MoveToLevel command to DUT, with Level =50 and TransitionTime =0 (immediate)");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::MoveToLevel::Type value;
            value.level = 50U;
            value.transitionTime.SetNonNull();
            value.transitionTime.Value() = 0U;
            value.optionsMask            = 0U;
            value.optionsOverride        = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                               chip::NullOptional

            );
        }
        case 11: {
            LogStep(11, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 12: {
            LogStep(12,
                    "TH sends a MoveToLevel command to the DUT with Level = 200 and TransitionTime = 300 (30 s). This means the "
                    "level should increase by 150 units in 30s, so 5 units/s");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::MoveToLevel::Type value;
            value.level = 200U;
            value.transitionTime.SetNonNull();
            value.transitionTime.Value() = 300U;
            value.optionsMask            = 0U;
            value.optionsOverride        = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                               chip::NullOptional

            );
        }
        case 13: {
            LogStep(13, "Wait 10000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000 && LVL.S.M.VarRate"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Wait 10000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 16: {
            LogStep(16, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000 && LVL.S.M.VarRate"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Wait 10000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 18: {
            LogStep(18, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000 && LVL.S.M.VarRate"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Wait 5000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 20: {
            LogStep(20, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000 && LVL.S.M.VarRate"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 21: {
            LogStep(21, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000 && !LVL.S.M.VarRate"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 22: {
            LogStep(22, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "TH reads Options attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::Options::Id, true,
                                 chip::NullOptional);
        }
        case 24: {
            LogStep(24, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 25: {
            LogStep(25, "TH sends a MoveToLevel command to the DUT with");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::MoveToLevel::Type value;
            value.level = 100U;
            value.transitionTime.SetNonNull();
            value.transitionTime.Value() = 0U;
            value.optionsMask            = 0U;
            value.optionsOverride        = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                               chip::NullOptional

            );
        }
        case 26: {
            LogStep(26, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 27: {
            LogStep(27, "TH sends Off command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 28: {
            LogStep(28, "TH sends a MoveToLevel command to the DUT with");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::MoveToLevel::Type value;
            value.level = 120U;
            value.transitionTime.SetNonNull();
            value.transitionTime.Value() = 0U;
            value.optionsMask            = 0U;
            value.optionsOverride        = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                               chip::NullOptional

            );
        }
        case 29: {
            LogStep(29, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 30: {
            LogStep(30, "TH sends a MoveToLevel command to the DUT with");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::MoveToLevel::Type value;
            value.level = 140U;
            value.transitionTime.SetNonNull();
            value.transitionTime.Value() = 0U;
            value.optionsMask            = 1U;
            value.optionsOverride        = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                               chip::NullOptional

            );
        }
        case 31: {
            LogStep(31, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 32: {
            LogStep(32, "TH sends a MoveToLevel command to the DUT with");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::MoveToLevel::Type value;
            value.level = 160U;
            value.transitionTime.SetNonNull();
            value.transitionTime.Value() = 0U;
            value.optionsMask            = 1U;
            value.optionsOverride        = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                               chip::NullOptional

            );
        }
        case 33: {
            LogStep(33, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 34: {
            LogStep(34, "TH writes 1 to the Options attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 1U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 35: {
            LogStep(35, "TH reads Options attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::Options::Id, true,
                                 chip::NullOptional);
        }
        case 36: {
            LogStep(36, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 37: {
            LogStep(37, "TH sends a MoveToLevel command to the DUT with");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::MoveToLevel::Type value;
            value.level = 100U;
            value.transitionTime.SetNonNull();
            value.transitionTime.Value() = 0U;
            value.optionsMask            = 0U;
            value.optionsOverride        = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                               chip::NullOptional

            );
        }
        case 38: {
            LogStep(38, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 39: {
            LogStep(39, "TH sends Off command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 40: {
            LogStep(40, "TH sends a MoveToLevel command to the DUT with");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::MoveToLevel::Type value;
            value.level = 120U;
            value.transitionTime.SetNonNull();
            value.transitionTime.Value() = 0U;
            value.optionsMask            = 0U;
            value.optionsOverride        = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                               chip::NullOptional

            );
        }
        case 41: {
            LogStep(41, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 42: {
            LogStep(42, "TH sends a MoveToLevel command to the DUT with");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::MoveToLevel::Type value;
            value.level = 140U;
            value.transitionTime.SetNonNull();
            value.transitionTime.Value() = 0U;
            value.optionsMask            = 1U;
            value.optionsOverride        = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                               chip::NullOptional

            );
        }
        case 43: {
            LogStep(43, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 44: {
            LogStep(44, "TH sends a MoveToLevel command to the DUT with");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::MoveToLevel::Type value;
            value.level = 160U;
            value.transitionTime.SetNonNull();
            value.transitionTime.Value() = 0U;
            value.optionsMask            = 1U;
            value.optionsOverride        = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                               chip::NullOptional

            );
        }
        case 45: {
            LogStep(45, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_LVL_4_1Suite : public TestCommand
{
public:
    Test_TC_LVL_4_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LVL_4_1", 26, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_LVL_4_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::app::DataModel::Nullable<uint8_t> CurrentLevelValue;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                CurrentLevelValue = value;
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 50U));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 85U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 115U));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 127U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 173U));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 170U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 230U));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 254U));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Precondition Send On Command");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Check on/off attribute value is true after on command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Precondition: write default value of OnOffTransitionTime attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint16_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id,
                                  LevelControl::Attributes::OnOffTransitionTime::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads the MaxLevel attribute from the DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::MaxLevel::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH sends Off command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp && LVL.S.C05.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "TH sends a MoveWithOnOff command to DUT, with MoveMode =0x00 (up) and Rate =10 (units/s)");
            VerifyOrDo(!ShouldSkip("LVL.S.C05.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::MoveWithOnOff::Type value;
            value.moveMode = static_cast<chip::app::Clusters::LevelControl::MoveMode>(0);
            value.rate.SetNonNull();
            value.rate.Value()    = 10U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveWithOnOff::Id, value,
                               chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "TH reads OnOff attribute (On/Off cluster) from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && LVL.S.C05.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C05.Rsp && LVL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Wait 5000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 11: {
            LogStep(11, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C05.Rsp && LVL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 12: {
            LogStep(12, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 13: {
            LogStep(13, "TH sends a MoveToLevel command to DUT, with Level =50 and TransitionTime =0 (immediate)");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::MoveToLevel::Type value;
            value.level = 50U;
            value.transitionTime.SetNonNull();
            value.transitionTime.Value() = 0U;
            value.optionsMask            = 0U;
            value.optionsOverride        = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                               chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 15: {
            LogStep(15, "TH sends a Move command to the DUT with MoveMode =0x00 (up) and Rate =5 (units/s)");
            VerifyOrDo(!ShouldSkip("LVL.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::Move::Type value;
            value.moveMode = static_cast<chip::app::Clusters::LevelControl::MoveMode>(0);
            value.rate.SetNonNull();
            value.rate.Value()    = 5U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::Move::Id, value,
                               chip::NullOptional

            );
        }
        case 16: {
            LogStep(16, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C01.Rsp && LVL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 19: {
            LogStep(19, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C01.Rsp && LVL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 21: {
            LogStep(21, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C01.Rsp && LVL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Wait 19s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 19000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 23: {
            LogStep(23, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C01.Rsp && LVL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 24: {
            LogStep(24, "Precondition send Off Command");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 25: {
            LogStep(25, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_LVL_5_1Suite : public TestCommand
{
public:
    Test_TC_LVL_5_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LVL_5_1", 23, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_LVL_5_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 50U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 85U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 115U));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 127U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 173U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 170U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 200U));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 200U));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 200U));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Precondition Send On Command");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Check on/off attribute value is true after on command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Precondition: write default value of OnOffTransitionTime attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint16_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id,
                                  LevelControl::Attributes::OnOffTransitionTime::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH sends Off command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp && LVL.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 6: {
            LogStep(6,
                    "TH sends a StepWithOnOff command to DUT, with StepMode =0x00 (up), StepSize =50 and TransitionTime =0 "
                    "(immediate)");
            VerifyOrDo(!ShouldSkip("LVL.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::StepWithOnOff::Type value;
            value.stepMode = static_cast<chip::app::Clusters::LevelControl::StepMode>(0);
            value.stepSize = 50U;
            value.transitionTime.SetNonNull();
            value.transitionTime.Value() = 0U;
            value.optionsMask            = 0U;
            value.optionsOverride        = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::StepWithOnOff::Id, value,
                               chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "TH reads OnOff attribute (On/Off cluster) from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && LVL.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "TH sends a MoveToLevel command to DUT, with Level =50 and TransitionTime =0 (immediate)");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::MoveToLevel::Type value;
            value.level = 50U;
            value.transitionTime.SetNonNull();
            value.transitionTime.Value() = 0U;
            value.optionsMask            = 0U;
            value.optionsOverride        = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                               chip::NullOptional

            );
        }
        case 10: {
            LogStep(10, "Reads current level attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.A0000 && LVL.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "TH sends a Step command to the DUT with StepMode =0x00 (up), StepSize =150 and TransitionTime =300");
            VerifyOrDo(!ShouldSkip("LVL.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::Step::Type value;
            value.stepMode = static_cast<chip::app::Clusters::LevelControl::StepMode>(0);
            value.stepSize = 150U;
            value.transitionTime.SetNonNull();
            value.transitionTime.Value() = 300U;
            value.optionsMask            = 0U;
            value.optionsOverride        = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::Step::Id, value,
                               chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C02.Rsp && LVL.S.A0000 && LVL.S.M.VarRate"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 15: {
            LogStep(15, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C02.Rsp && LVL.S.A0000 && LVL.S.M.VarRate"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C02.Rsp && LVL.S.A0000 && LVL.S.M.VarRate"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Wait 5000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 19: {
            LogStep(19, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C02.Rsp && LVL.S.A0000 && LVL.S.M.VarRate"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 20: {
            LogStep(20, "TH reads CurrentLevel attribute from DUT (after DUT has finished the transition)");
            VerifyOrDo(!ShouldSkip("LVL.S.C02.Rsp && LVL.S.A0000 && !LVL.S.M.VarRate"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 21: {
            LogStep(21, "Precondition send Off Command");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 22: {
            LogStep(22, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_LVL_6_1Suite : public TestCommand
{
public:
    Test_TC_LVL_6_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LVL_6_1", 18, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_LVL_6_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 50U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 64U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 86U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 85U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 115U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Precondition: write default value of OnOffTransitionTime attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint16_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id,
                                  LevelControl::Attributes::OnOffTransitionTime::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "TH sends a MoveToLevel command to DUT, with Level =50 and TransitionTime =0 (immediate)");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::MoveToLevel::Type value;
            value.level = 50U;
            value.transitionTime.SetNonNull();
            value.transitionTime.Value() = 0U;
            value.optionsMask            = 0U;
            value.optionsOverride        = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                               chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.A0000 && LVL.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6,
                    "TH sends a Move command to the DUT, with the MoveMode field set to 0x00 (move up) and the Rate field set to "
                    "0x05 (5 units/s)");
            VerifyOrDo(!ShouldSkip("LVL.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::Move::Type value;
            value.moveMode = static_cast<chip::app::Clusters::LevelControl::MoveMode>(0);
            value.rate.SetNonNull();
            value.rate.Value()    = 5U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::Move::Id, value,
                               chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "Wait 5000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 8: {
            LogStep(8, "Sends stop command to DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::Stop::Type value;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::Stop::Id, value,
                               chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "Physically verify that the device has stopped transitioning");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && LVL.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C01.Rsp && LVL.S.C03.Rsp && LVL.S.A0000"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11,
                    "TH sends a Move command to the DUT, with the MoveMode field set to 0x00 (move up) and the Rate field set to "
                    "0x05 (5 units/s)");
            VerifyOrDo(!ShouldSkip("LVL.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::Move::Type value;
            value.moveMode = static_cast<chip::app::Clusters::LevelControl::MoveMode>(0);
            value.rate.SetNonNull();
            value.rate.Value()    = 5U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::Move::Id, value,
                               chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "Wait 5000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "TH sends a StopWithOnOff command to the DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::StopWithOnOff::Type value;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::StopWithOnOff::Id, value,
                               chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "Physically verify that the device has stopped transitioning");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && LVL.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 15: {
            LogStep(15, "Reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C01.Rsp && LVL.S.C07.Rsp && LVL.S.A0000"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Precondition send Off Command");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 17: {
            LogStep(17, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_LCFG_1_1Suite : public TestCommand
{
public:
    Test_TC_LCFG_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LCFG_1_1", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_LCFG_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH reads the ClusterRevision from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), LocalizationConfiguration::Id,
                                 LocalizationConfiguration::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads the FeatureMap from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), LocalizationConfiguration::Id,
                                 LocalizationConfiguration::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH reads AttributeList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), LocalizationConfiguration::Id,
                                 LocalizationConfiguration::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads AcceptedCommandList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), LocalizationConfiguration::Id,
                                 LocalizationConfiguration::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads GeneratedCommandList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), LocalizationConfiguration::Id,
                                 LocalizationConfiguration::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_LUNIT_1_2Suite : public TestCommand
{
public:
    Test_TC_LUNIT_1_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LUNIT_1_2", 8, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_LUNIT_1_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH reads the ClusterRevision from DUT");
            VerifyOrDo(!ShouldSkip("LUNIT.S.Afffd"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), UnitLocalization::Id,
                                 UnitLocalization::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads the FeatureMap from DUT");
            VerifyOrDo(!ShouldSkip("LUNIT.S.Afffc && !LUNIT.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), UnitLocalization::Id, UnitLocalization::Attributes::FeatureMap::Id,
                                 true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Given LUNIT.S.F00(TEMP) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("LUNIT.S.Afffc && LUNIT.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), UnitLocalization::Id, UnitLocalization::Attributes::FeatureMap::Id,
                                 true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads AttributeList from DUT");
            VerifyOrDo(!ShouldSkip("LUNIT.S.Afffb"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), UnitLocalization::Id,
                                 UnitLocalization::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads Feature dependent(LUNIT.S.F00) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("LUNIT.S.Afffb && LUNIT.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), UnitLocalization::Id,
                                 UnitLocalization::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH reads AcceptedCommandList from DUT");
            VerifyOrDo(!ShouldSkip("LUNIT.S.Afff9"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), UnitLocalization::Id,
                                 UnitLocalization::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH reads GeneratedCommandList from DUT");
            VerifyOrDo(!ShouldSkip("LUNIT.S.Afff8"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), UnitLocalization::Id,
                                 UnitLocalization::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_LTIME_1_2Suite : public TestCommand
{
public:
    Test_TC_LTIME_1_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LTIME_1_2", 8, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_LTIME_1_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 1UL));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH reads the ClusterRevision from DUT");
            VerifyOrDo(!ShouldSkip("LTIME.S.Afffd"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), TimeFormatLocalization::Id,
                                 TimeFormatLocalization::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads the FeatureMap from DUT");
            VerifyOrDo(!ShouldSkip("LTIME.S.Afffc"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), TimeFormatLocalization::Id,
                                 TimeFormatLocalization::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH reads AttributeList from DUT");
            VerifyOrDo(!ShouldSkip("LTIME.S.Afffb"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), TimeFormatLocalization::Id,
                                 TimeFormatLocalization::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads optional attribute(ActiveCalendarType) in AttributeList from DUT");
            VerifyOrDo(!ShouldSkip("LTIME.S.Afffb && LTIME.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), TimeFormatLocalization::Id,
                                 TimeFormatLocalization::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads optional attribute(SupportedCalendarTypes) in AttributeList from DUT");
            VerifyOrDo(!ShouldSkip("LTIME.S.Afffb && LTIME.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), TimeFormatLocalization::Id,
                                 TimeFormatLocalization::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH reads AcceptedCommandList from DUT");
            VerifyOrDo(!ShouldSkip("LTIME.S.Afff9"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), TimeFormatLocalization::Id,
                                 TimeFormatLocalization::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH reads GeneratedCommandList from DUT");
            VerifyOrDo(!ShouldSkip("LTIME.S.Afff8"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), TimeFormatLocalization::Id,
                                 TimeFormatLocalization::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_LOWPOWER_1_1Suite : public TestCommand
{
public:
    Test_TC_LOWPOWER_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_LOWPOWER_1_1", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_LOWPOWER_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 0));
                    VerifyOrReturn(CheckValue("attributeList[0]", iter_0.GetValue(), 65528UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 1));
                    VerifyOrReturn(CheckValue("attributeList[1]", iter_0.GetValue(), 65529UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 2));
                    VerifyOrReturn(CheckValue("attributeList[2]", iter_0.GetValue(), 65531UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 3));
                    VerifyOrReturn(CheckValue("attributeList[3]", iter_0.GetValue(), 65532UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 4));
                    VerifyOrReturn(CheckValue("attributeList[4]", iter_0.GetValue(), 65533UL));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("attributeList", iter_0, 5));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acceptedCommandList", iter_0, 0));
                    VerifyOrReturn(CheckValue("acceptedCommandList[0]", iter_0.GetValue(), 0UL));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 1));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LowPower::Id, LowPower::Attributes::ClusterRevision::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LowPower::Id, LowPower::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LowPower::Id, LowPower::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LowPower::Id, LowPower::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LowPower::Id, LowPower::Attributes::GeneratedCommandList::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_KEYPADINPUT_1_2Suite : public TestCommand
{
public:
    Test_TC_KEYPADINPUT_1_2Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_KEYPADINPUT_1_2", 9, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_KEYPADINPUT_1_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 2UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 4UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), KeypadInput::Id, KeypadInput::Attributes::ClusterRevision::Id,
                                 true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            VerifyOrDo(!ShouldSkip(" !KEYPADINPUT.S.NV && KEYPADINPUT.S.LK && !KEYPADINPUT.S.NK "),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), KeypadInput::Id, KeypadInput::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Given (KEYPADINPUT.S.NV) FeatureMap bit mask is set or not");
            VerifyOrDo(!ShouldSkip("KEYPADINPUT.S.NV"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), KeypadInput::Id, KeypadInput::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Given (KEYPADINPUT.S.LK) FeatureMap bit mask is set or not");
            VerifyOrDo(!ShouldSkip("KEYPADINPUT.S.LK"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), KeypadInput::Id, KeypadInput::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Given (KEYPADINPUT.S.NK) FeatureMap bit mask is set or not");
            VerifyOrDo(!ShouldSkip("KEYPADINPUT.S.NK"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), KeypadInput::Id, KeypadInput::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), KeypadInput::Id, KeypadInput::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), KeypadInput::Id, KeypadInput::Attributes::AcceptedCommandList::Id,
                                 true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), KeypadInput::Id, KeypadInput::Attributes::GeneratedCommandList::Id,
                                 true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_APPLAUNCHER_1_3Suite : public TestCommand
{
public:
    Test_TC_APPLAUNCHER_1_3Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_APPLAUNCHER_1_3", 9, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_APPLAUNCHER_1_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 1UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ApplicationLauncher::Id,
                                 ApplicationLauncher::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            VerifyOrDo(!ShouldSkip("APPLAUNCHER.S.AP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ApplicationLauncher::Id,
                                 ApplicationLauncher::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the global attribute: FeatureMap");
            VerifyOrDo(!ShouldSkip(" !APPLAUNCHER.S.AP "), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ApplicationLauncher::Id,
                                 ApplicationLauncher::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ApplicationLauncher::Id,
                                 ApplicationLauncher::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the optional attribute(CatalogList) in AttributeList");
            VerifyOrDo(!ShouldSkip("APPLAUNCHER.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ApplicationLauncher::Id,
                                 ApplicationLauncher::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read the optional attribute(CurrentApp) in AttributeList");
            VerifyOrDo(!ShouldSkip("APPLAUNCHER.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ApplicationLauncher::Id,
                                 ApplicationLauncher::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ApplicationLauncher::Id,
                                 ApplicationLauncher::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ApplicationLauncher::Id,
                                 ApplicationLauncher::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAINPUT_1_4Suite : public TestCommand
{
public:
    Test_TC_MEDIAINPUT_1_4Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_MEDIAINPUT_1_4", 9, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MEDIAINPUT_1_4Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Attributes::ClusterRevision::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            VerifyOrDo(!ShouldSkip(" !MEDIAINPUT.S.NU "), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Given MEDIAINPUT.S.NU ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("MEDIAINPUT.S.NU"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the optional attribute(InputList) in AttributeList");
            VerifyOrDo(!ShouldSkip("MEDIAINPUT.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read the optional attribute(CurrentInput) in AttributeList");
            VerifyOrDo(!ShouldSkip("MEDIAINPUT.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Attributes::AcceptedCommandList::Id,
                                 true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Attributes::GeneratedCommandList::Id,
                                 true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_WAKEONLAN_1_5Suite : public TestCommand
{
public:
    Test_TC_WAKEONLAN_1_5Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_WAKEONLAN_1_5", 7, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_WAKEONLAN_1_5Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WakeOnLan::Id, WakeOnLan::Attributes::ClusterRevision::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WakeOnLan::Id, WakeOnLan::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WakeOnLan::Id, WakeOnLan::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the optional attribute(MACAddress) in AttributeList");
            VerifyOrDo(!ShouldSkip("WAKEONLAN.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WakeOnLan::Id, WakeOnLan::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WakeOnLan::Id, WakeOnLan::Attributes::AcceptedCommandList::Id,
                                 true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WakeOnLan::Id, WakeOnLan::Attributes::GeneratedCommandList::Id,
                                 true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CHANNEL_1_6Suite : public TestCommand
{
public:
    Test_TC_CHANNEL_1_6Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CHANNEL_1_6", 14, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CHANNEL_1_6Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 2UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::ClusterRevision::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            VerifyOrDo(!ShouldSkip("( !CHANNEL.S.CL && !CHANNEL.S.LI )"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Given CHANNEL.S.CL ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("CHANNEL.S.CL"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Given CHANNEL.S.LI ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("CHANNEL.S.LI"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read the optional attribute(ChannelList): AttributeList");
            VerifyOrDo(!ShouldSkip("CHANNEL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Reading optional attribute(Lineup) in AttributeList");
            VerifyOrDo(!ShouldSkip("CHANNEL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read the optional attribute(CurrentChannel): AttributeList");
            VerifyOrDo(!ShouldSkip("CHANNEL.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Read the optional command(ChangeChannel) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("CHANNEL.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Read the optional command(ChangeChannelByNumber) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("CHANNEL.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Read the optional command(SkipChannel) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("CHANNEL.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Read the global attribute: GeneratedCommandList");
            VerifyOrDo(!ShouldSkip("( !CHANNEL.S.CL && !CHANNEL.S.LI )"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::GeneratedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Read the global attribute: GeneratedCommandList");
            VerifyOrDo(!ShouldSkip("CHANNEL.S.CL || CHANNEL.S.LI"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::GeneratedCommandList::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAPLAYBACK_1_7Suite : public TestCommand
{
public:
    Test_TC_MEDIAPLAYBACK_1_7Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_MEDIAPLAYBACK_1_7", 22, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MEDIAPLAYBACK_1_7Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 2UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 6UL));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 6UL));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 7UL));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 8UL));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 9UL));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 11UL));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 10UL));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::ClusterRevision::Id,
                                 true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            VerifyOrDo(!ShouldSkip(" !MEDIAPLAYBACK.S.AS && !MEDIAPLAYBACK.S.VS "), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Given MEDIAPLAYBACK.S.AS ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.AS"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Given MEDIAPLAYBACK.S.VS ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.VS"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read the optional attribute(StartTime) in AttributeList");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read the optional attribute(Duration) in AttributeList");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read the optional attribute(SampledPosition) in AttributeList");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Read the optional attribute(PlaybackSpeed) in AttributeList");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Read the optional attribute(SeekRangeEnd) in AttributeList");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Read the optional attribute(SeekRangeStart) in AttributeList");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id,
                                 MediaPlayback::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Read the optional command(StartOver) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id,
                                 MediaPlayback::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Read the optional command(Previous) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C04.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id,
                                 MediaPlayback::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Read the optional command(Next) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C05.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id,
                                 MediaPlayback::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Read the optional command(Rewind) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id,
                                 MediaPlayback::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Read the optional command(FastForward) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id,
                                 MediaPlayback::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Read the optional command(SkipForward) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C08.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id,
                                 MediaPlayback::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Read the optional command(SkipBackward) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C09.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id,
                                 MediaPlayback::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Read the optional command(Seek) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C0B.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id,
                                 MediaPlayback::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id,
                                 MediaPlayback::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_AUDIOOUTPUT_1_8Suite : public TestCommand
{
public:
    Test_TC_AUDIOOUTPUT_1_8Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_AUDIOOUTPUT_1_8", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_AUDIOOUTPUT_1_8Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3UL));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), AudioOutput::Id, AudioOutput::Attributes::ClusterRevision::Id,
                                 true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), AudioOutput::Id, AudioOutput::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), AudioOutput::Id, AudioOutput::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), AudioOutput::Id, AudioOutput::Attributes::AcceptedCommandList::Id,
                                 true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), AudioOutput::Id, AudioOutput::Attributes::GeneratedCommandList::Id,
                                 true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_TGTNAV_1_9Suite : public TestCommand
{
public:
    Test_TC_TGTNAV_1_9Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_TGTNAV_1_9", 7, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_TGTNAV_1_9Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TargetNavigator::Id,
                                 TargetNavigator::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TargetNavigator::Id, TargetNavigator::Attributes::FeatureMap::Id,
                                 true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TargetNavigator::Id,
                                 TargetNavigator::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the optional attribute(CurrentTarget) in AttributeList");
            VerifyOrDo(!ShouldSkip("TGTNAV.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TargetNavigator::Id,
                                 TargetNavigator::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TargetNavigator::Id,
                                 TargetNavigator::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TargetNavigator::Id,
                                 TargetNavigator::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_TGTNAV_8_2Suite : public TestCommand
{
public:
    Test_TC_TGTNAV_8_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_TGTNAV_8_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_TGTNAV_8_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_APBSC_1_10Suite : public TestCommand
{
public:
    Test_TC_APBSC_1_10Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_APBSC_1_10", 9, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_APBSC_1_10Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 6UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 7UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id,
                                 ApplicationBasic::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read FeatureMap attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id, ApplicationBasic::Attributes::FeatureMap::Id,
                                 true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id,
                                 ApplicationBasic::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the optional attribute(VendorName) in AttributeList");
            VerifyOrDo(!ShouldSkip("APBSC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id,
                                 ApplicationBasic::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the optional attribute(VendorID) in AttributeList");
            VerifyOrDo(!ShouldSkip("APBSC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id,
                                 ApplicationBasic::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read the optional attribute(ProductID) in AttributeList");
            VerifyOrDo(!ShouldSkip("APBSC.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id,
                                 ApplicationBasic::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id,
                                 ApplicationBasic::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id,
                                 ApplicationBasic::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CONTENTLAUNCHER_1_11Suite : public TestCommand
{
public:
    Test_TC_CONTENTLAUNCHER_1_11Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CONTENTLAUNCHER_1_11", 11, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CONTENTLAUNCHER_1_11Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 2UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ContentLauncher::Id,
                                 ContentLauncher::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            VerifyOrDo(!ShouldSkip("( !CONTENTLAUNCHER.S.CS && !CONTENTLAUNCHER.S.UP )"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ContentLauncher::Id, ContentLauncher::Attributes::FeatureMap::Id,
                                 true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Given CONTENTLAUNCHER.S.CS) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("CONTENTLAUNCHER.S.CS"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ContentLauncher::Id, ContentLauncher::Attributes::FeatureMap::Id,
                                 true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Given CONTENTLAUNCHER.S.UP ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("CONTENTLAUNCHER.S.UP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ContentLauncher::Id, ContentLauncher::Attributes::FeatureMap::Id,
                                 true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ContentLauncher::Id,
                                 ContentLauncher::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read the optional attribute(AcceptHeader): AttributeList");
            VerifyOrDo(!ShouldSkip("CONTENTLAUNCHER.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ContentLauncher::Id,
                                 ContentLauncher::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read the optional attribute(SupportedStreamingProtocols): AttributeList");
            VerifyOrDo(!ShouldSkip("CONTENTLAUNCHER.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ContentLauncher::Id,
                                 ContentLauncher::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read the optional command(LaunchContent) in AcceptedCommandList attribute");
            VerifyOrDo(!ShouldSkip("CONTENTLAUNCHER.C.C00.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ContentLauncher::Id,
                                 ContentLauncher::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Read the optional command(LaunchURL) in AcceptedCommandList attribute");
            VerifyOrDo(!ShouldSkip("CONTENTLAUNCHER.C.C01.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ContentLauncher::Id,
                                 ContentLauncher::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ContentLauncher::Id,
                                 ContentLauncher::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ALOGIN_1_12Suite : public TestCommand
{
public:
    Test_TC_ALOGIN_1_12Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_ALOGIN_1_12", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ALOGIN_1_12Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), AccountLogin::Id, AccountLogin::Attributes::ClusterRevision::Id,
                                 true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), AccountLogin::Id, AccountLogin::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), AccountLogin::Id, AccountLogin::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), AccountLogin::Id,
                                 AccountLogin::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), AccountLogin::Id,
                                 AccountLogin::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_LOWPOWER_2_1Suite : public TestCommand
{
public:
    Test_TC_LOWPOWER_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_LOWPOWER_2_1", 2, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_LOWPOWER_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH sends Sleep command to DUT");
            VerifyOrDo(!ShouldSkip("LOWPOWER.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LowPower::Commands::Sleep::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LowPower::Id, LowPower::Commands::Sleep::Id, value,
                               chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_KEYPADINPUT_3_2Suite : public TestCommand
{
public:
    Test_TC_KEYPADINPUT_3_2Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_KEYPADINPUT_3_2", 3, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_KEYPADINPUT_3_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::KeypadInput::Commands::SendKeyResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::KeypadInput::Commands::SendKeyResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH sends CEC Settings Keys(0x0A) to DUT");
            VerifyOrDo(!ShouldSkip("KEYPADINPUT.S.LK && KEYPADINPUT.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::KeypadInput::Commands::SendKey::Type value;
            value.keyCode = static_cast<chip::app::Clusters::KeypadInput::CecKeyCode>(10);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), KeypadInput::Id, KeypadInput::Commands::SendKey::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "TH sends CEC Home Keys(0x09) to DUT");
            VerifyOrDo(!ShouldSkip("KEYPADINPUT.S.LK && KEYPADINPUT.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::KeypadInput::Commands::SendKey::Type value;
            value.keyCode = static_cast<chip::app::Clusters::KeypadInput::CecKeyCode>(9);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), KeypadInput::Id, KeypadInput::Commands::SendKey::Id, value,
                               chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_KEYPADINPUT_3_3Suite : public TestCommand
{
public:
    Test_TC_KEYPADINPUT_3_3Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_KEYPADINPUT_3_3", 10, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_KEYPADINPUT_3_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::KeypadInput::Commands::SendKeyResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::KeypadInput::Commands::SendKeyResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::KeypadInput::Commands::SendKeyResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::KeypadInput::Commands::SendKeyResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::KeypadInput::Commands::SendKeyResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::KeypadInput::Commands::SendKeyResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::KeypadInput::Commands::SendKeyResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::KeypadInput::Commands::SendKeyResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::KeypadInput::Commands::SendKeyResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Send Numbers1");
            VerifyOrDo(!ShouldSkip("KEYPADINPUT.S.C00.Rsp && KEYPADINPUT.S.NK"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::KeypadInput::Commands::SendKey::Type value;
            value.keyCode = static_cast<chip::app::Clusters::KeypadInput::CecKeyCode>(33);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), KeypadInput::Id, KeypadInput::Commands::SendKey::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Send Numbers2");
            VerifyOrDo(!ShouldSkip("KEYPADINPUT.S.C00.Rsp && KEYPADINPUT.S.NK"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::KeypadInput::Commands::SendKey::Type value;
            value.keyCode = static_cast<chip::app::Clusters::KeypadInput::CecKeyCode>(34);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), KeypadInput::Id, KeypadInput::Commands::SendKey::Id, value,
                               chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "Send Numbers3");
            VerifyOrDo(!ShouldSkip("KEYPADINPUT.S.C00.Rsp && KEYPADINPUT.S.NK"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::KeypadInput::Commands::SendKey::Type value;
            value.keyCode = static_cast<chip::app::Clusters::KeypadInput::CecKeyCode>(35);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), KeypadInput::Id, KeypadInput::Commands::SendKey::Id, value,
                               chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Send Numbers4");
            VerifyOrDo(!ShouldSkip("KEYPADINPUT.S.C00.Rsp && KEYPADINPUT.S.NK"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::KeypadInput::Commands::SendKey::Type value;
            value.keyCode = static_cast<chip::app::Clusters::KeypadInput::CecKeyCode>(36);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), KeypadInput::Id, KeypadInput::Commands::SendKey::Id, value,
                               chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "Send Numbers5");
            VerifyOrDo(!ShouldSkip("KEYPADINPUT.S.C00.Rsp && KEYPADINPUT.S.NK"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::KeypadInput::Commands::SendKey::Type value;
            value.keyCode = static_cast<chip::app::Clusters::KeypadInput::CecKeyCode>(37);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), KeypadInput::Id, KeypadInput::Commands::SendKey::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Send Numbers6");
            VerifyOrDo(!ShouldSkip("KEYPADINPUT.S.C00.Rsp && KEYPADINPUT.S.NK"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::KeypadInput::Commands::SendKey::Type value;
            value.keyCode = static_cast<chip::app::Clusters::KeypadInput::CecKeyCode>(38);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), KeypadInput::Id, KeypadInput::Commands::SendKey::Id, value,
                               chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "Send Numbers7");
            VerifyOrDo(!ShouldSkip("KEYPADINPUT.S.C00.Rsp && KEYPADINPUT.S.NK"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::KeypadInput::Commands::SendKey::Type value;
            value.keyCode = static_cast<chip::app::Clusters::KeypadInput::CecKeyCode>(39);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), KeypadInput::Id, KeypadInput::Commands::SendKey::Id, value,
                               chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "Send Numbers8");
            VerifyOrDo(!ShouldSkip("KEYPADINPUT.S.C00.Rsp && KEYPADINPUT.S.NK"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::KeypadInput::Commands::SendKey::Type value;
            value.keyCode = static_cast<chip::app::Clusters::KeypadInput::CecKeyCode>(40);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), KeypadInput::Id, KeypadInput::Commands::SendKey::Id, value,
                               chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "Send Numbers9");
            VerifyOrDo(!ShouldSkip("KEYPADINPUT.S.C00.Rsp && KEYPADINPUT.S.NK"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::KeypadInput::Commands::SendKey::Type value;
            value.keyCode = static_cast<chip::app::Clusters::KeypadInput::CecKeyCode>(41);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), KeypadInput::Id, KeypadInput::Commands::SendKey::Id, value,
                               chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_APPLAUNCHER_3_5Suite : public TestCommand
{
public:
    Test_TC_APPLAUNCHER_3_5Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_APPLAUNCHER_3_5", 2, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_APPLAUNCHER_3_5Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1,
                    "TH reads CatalogList attribute from the DUT and where each entry in the list is a CSA-issued Vendor Id of "
                    "type unsigned 16 bit integer ranging between 0-65536 for the catalog");
            VerifyOrDo(!ShouldSkip("APPLAUNCHER.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ApplicationLauncher::Id,
                                 ApplicationLauncher::Attributes::CatalogList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_APPLAUNCHER_3_6Suite : public TestCommand
{
public:
    Test_TC_APPLAUNCHER_3_6Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_APPLAUNCHER_3_6", 2, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_APPLAUNCHER_3_6Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::ApplicationLauncher::Structs::ApplicationEP::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1,
                    "TH reads CurrentApp attribute from the DUT and Verify the in-focus application attributes, which should "
                    "include the display Application ID(type:uint16) Catalog Vendor ID(type:string) or Null if there is no current "
                    "in-focus application");
            VerifyOrDo(!ShouldSkip("APPLAUNCHER.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ApplicationLauncher::Id,
                                 ApplicationLauncher::Attributes::CurrentApp::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_APPLAUNCHER_3_7Suite : public TestCommand
{
public:
    Test_TC_APPLAUNCHER_3_7Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_APPLAUNCHER_3_7", 3, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("catalogVendorId", 0, UINT16_MAX, &mCatalogVendorId);
        AddArgument("applicationId", &mApplicationId);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_APPLAUNCHER_3_7Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mCatalogVendorId;
    chip::Optional<chip::CharSpan> mApplicationId;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::ApplicationLauncher::Commands::LauncherResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::ApplicationLauncher::Commands::LauncherResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 1U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Launch an app with the provided a application ID");
            VerifyOrDo(!ShouldSkip("APPLAUNCHER.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ApplicationLauncher::Commands::LaunchApp::Type value;

            value.application.catalogVendorId = mCatalogVendorId.HasValue() ? mCatalogVendorId.Value() : 123U;
            value.application.applicationId =
                mApplicationId.HasValue() ? mApplicationId.Value() : chip::Span<const char>("exampleid", 9);

            value.data.Emplace();
            value.data.Value() = chip::ByteSpan(chip::Uint8::from_const_char("Hello Worldgarbage: not in length on purpose"), 11);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ApplicationLauncher::Id,
                               ApplicationLauncher::Commands::LaunchApp::Id, value, chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "TH sends a LaunchApp command to DUT to launch an app which is not available");
            VerifyOrDo(!ShouldSkip("APPLAUNCHER.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ApplicationLauncher::Commands::LaunchApp::Type value;

            value.application.catalogVendorId = mCatalogVendorId.HasValue() ? mCatalogVendorId.Value() : 123U;
            value.application.applicationId   = chip::Span<const char>("NonAvailableAppgarbage: not in length on purpose", 15);

            value.data.Emplace();
            value.data.Value() = chip::ByteSpan(chip::Uint8::from_const_char("Hello Worldgarbage: not in length on purpose"), 11);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ApplicationLauncher::Id,
                               ApplicationLauncher::Commands::LaunchApp::Id, value, chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_APPLAUNCHER_3_8Suite : public TestCommand
{
public:
    Test_TC_APPLAUNCHER_3_8Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_APPLAUNCHER_3_8", 3, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("catalogVendorId", 0, UINT16_MAX, &mCatalogVendorId);
        AddArgument("applicationId", &mApplicationId);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_APPLAUNCHER_3_8Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mCatalogVendorId;
    chip::Optional<chip::CharSpan> mApplicationId;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::ApplicationLauncher::Commands::LauncherResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Stop an app with the provided application ID");
            VerifyOrDo(!ShouldSkip("APPLAUNCHER.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ApplicationLauncher::Commands::StopApp::Type value;

            value.application.catalogVendorId = mCatalogVendorId.HasValue() ? mCatalogVendorId.Value() : 123U;
            value.application.applicationId =
                mApplicationId.HasValue() ? mApplicationId.Value() : chip::Span<const char>("exampleid", 9);

            return SendCommand(kIdentityAlpha, GetEndpoint(1), ApplicationLauncher::Id, ApplicationLauncher::Commands::StopApp::Id,
                               value, chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Reads the Status attribute");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' after successgarbage: not in length on purpose", 30);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_APPLAUNCHER_3_9Suite : public TestCommand
{
public:
    Test_TC_APPLAUNCHER_3_9Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_APPLAUNCHER_3_9", 3, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("catalogVendorId", 0, UINT16_MAX, &mCatalogVendorId);
        AddArgument("applicationId", &mApplicationId);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_APPLAUNCHER_3_9Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mCatalogVendorId;
    chip::Optional<chip::CharSpan> mApplicationId;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::ApplicationLauncher::Commands::LauncherResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH sends HideApp command to DUT");
            VerifyOrDo(!ShouldSkip("APPLAUNCHER.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ApplicationLauncher::Commands::HideApp::Type value;

            value.application.catalogVendorId = mCatalogVendorId.HasValue() ? mCatalogVendorId.Value() : 123U;
            value.application.applicationId =
                mApplicationId.HasValue() ? mApplicationId.Value() : chip::Span<const char>("exampleid", 9);

            return SendCommand(kIdentityAlpha, GetEndpoint(1), ApplicationLauncher::Id, ApplicationLauncher::Commands::HideApp::Id,
                               value, chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Reads the Status attribute");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAINPUT_3_10Suite : public TestCommand
{
public:
    Test_TC_MEDIAINPUT_3_10Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_MEDIAINPUT_3_10", 2, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MEDIAINPUT_3_10Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::MediaInput::Structs::InputInfo::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1,
                    "TH reads the InputList attribute from the DUT to show list of Inputs available and Verify list of available "
                    "inputs supported by the device is provided, where each entry in the list contains an index(type:uint 8), "
                    "InputType (InputType Enums), Name (type: Strings), and Description(Type:String)");
            VerifyOrDo(!ShouldSkip("MEDIAINPUT.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Attributes::InputList::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAINPUT_3_11Suite : public TestCommand
{
public:
    Test_TC_MEDIAINPUT_3_11Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_MEDIAINPUT_3_11", 4, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MEDIAINPUT_3_11Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::MediaInput::Structs::InputInfo::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentInput", value, 1U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1,
                    "TH reads the InputList attribute from the DUT to show list of Inputs available and Verify list of available "
                    "inputs supported by the device is provided, where each entry in the list contains an index(type:uint 8), "
                    "InputType (InputType Enums), Name (type: Strings), and Description(Type:String)");
            VerifyOrDo(!ShouldSkip("MEDIAINPUT.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Attributes::InputList::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Select Input Command");
            VerifyOrDo(!ShouldSkip("MEDIAINPUT.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaInput::Commands::SelectInput::Type value;
            value.index = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Commands::SelectInput::Id, value,
                               chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "Read current input list");
            VerifyOrDo(!ShouldSkip("MEDIAINPUT.S.A0001 && MEDIAINPUT.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Attributes::CurrentInput::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAINPUT_3_12Suite : public TestCommand
{
public:
    Test_TC_MEDIAINPUT_3_12Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_MEDIAINPUT_3_12", 4, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MEDIAINPUT_3_12Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::MediaInput::Structs::InputInfo::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1,
                    "TH reads the InputList attribute from the DUT to show list of Inputs available and Verify list of available "
                    "inputs supported by the device is provided, where each entry in the list contains an index(type:uint 8), "
                    "InputType (InputType Enums), Name (type: Strings), and Description(Type:String)");
            VerifyOrDo(!ShouldSkip("MEDIAINPUT.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Attributes::InputList::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Show Input Status Command");
            VerifyOrDo(!ShouldSkip("MEDIAINPUT.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaInput::Commands::ShowInputStatus::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Commands::ShowInputStatus::Id, value,
                               chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "Hide Input Status Command");
            VerifyOrDo(!ShouldSkip("MEDIAINPUT.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaInput::Commands::HideInputStatus::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Commands::HideInputStatus::Id, value,
                               chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAINPUT_3_13Suite : public TestCommand
{
public:
    Test_TC_MEDIAINPUT_3_13Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_MEDIAINPUT_3_13", 4, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MEDIAINPUT_3_13Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::MediaInput::Structs::InputInfo::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH reads the InputList attribute from the DUT to show list of Inputs available");
            VerifyOrDo(!ShouldSkip("MEDIAINPUT.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Attributes::InputList::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Rename Input Command");
            VerifyOrDo(!ShouldSkip("MEDIAINPUT.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaInput::Commands::RenameInput::Type value;
            value.index = 1U;
            value.name  = chip::Span<const char>("A1garbage: not in length on purpose", 2);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Commands::RenameInput::Id, value,
                               chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "TH reads the InputList attribute from the DUT to show list of Inputs available");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAINPUT.S.A0000 && MEDIAINPUT.S.C03.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CHANNEL_5_1Suite : public TestCommand
{
public:
    Test_TC_CHANNEL_5_1Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CHANNEL_5_1", 2, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CHANNEL_5_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::Channel::Structs::ChannelInfo::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1,
                    "TH reads the ChannelList attribute from the DUT to show list of Inputs available and Verify that the response "
                    "contains a list of the known TV channels. Each list element should consist of the following,Major number "
                    "(unsigned 16-bit integer, mandatory),Minor number (unsigned 16-bit integer, mandatory),Name (String, "
                    "optional),Call sign (String, optional),Affiliate call sign (String, optional)");
            VerifyOrDo(!ShouldSkip("CHANNEL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::ChannelList::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CHANNEL_5_2Suite : public TestCommand
{
public:
    Test_TC_CHANNEL_5_2Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CHANNEL_5_2", 5, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("majornumber", 0, UINT16_MAX, &mMajornumber);
        AddArgument("minornumber", 0, UINT16_MAX, &mMinornumber);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CHANNEL_5_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mMajornumber;
    chip::Optional<uint16_t> mMinornumber;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::Channel::Structs::ChannelInfo::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::Channel::Structs::ChannelInfo::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentChannel", value));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Reads the ChannelList attribute");
            VerifyOrDo(!ShouldSkip("CHANNEL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::ChannelList::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends a ChangeChannelByNumber command");
            VerifyOrDo(!ShouldSkip("CHANNEL.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Channel::Commands::ChangeChannelByNumber::Type value;
            value.majorNumber = mMajornumber.HasValue() ? mMajornumber.Value() : 9U;
            value.minorNumber = mMinornumber.HasValue() ? mMinornumber.Value() : 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Commands::ChangeChannelByNumber::Id, value,
                               chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "Verify that the channel has changed on the device");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && CHANNEL.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>(
                "Please enter 'y' if channel has changed on the devicegarbage: not in length on purpose", 53);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 4: {
            LogStep(4, "Reads the CurrentChannel attribute");
            VerifyOrDo(!ShouldSkip("CHANNEL.S.A0002 && CHANNEL.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::CurrentChannel::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CHANNEL_5_3Suite : public TestCommand
{
public:
    Test_TC_CHANNEL_5_3Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CHANNEL_5_3", 7, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("majornumber", 0, UINT16_MAX, &mMajornumber);
        AddArgument("minornumber", 0, UINT16_MAX, &mMinornumber);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CHANNEL_5_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mMajornumber;
    chip::Optional<uint16_t> mMinornumber;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::Channel::Structs::LineupInfo::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::Channel::Structs::ChannelInfo::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::Channel::Structs::ChannelInfo::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentChannel", value));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::Channel::Structs::ChannelInfo::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentChannel", value));
                VerifyOrReturn(CheckConstraintType("value", "ChannelInfo", "ChannelInfo"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1,
                    "TH reads the Lineup attribute from the DUT to show list of Inputs available and Verify that the response "
                    "contains a lineup info object");
            VerifyOrDo(!ShouldSkip("CHANNEL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::Lineup::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Reads the ChannelList attribute from the DUT");
            VerifyOrDo(!ShouldSkip("CHANNEL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::ChannelList::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Reads the CurrentChannel attribute from the DUT");
            VerifyOrDo(!ShouldSkip("CHANNEL.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::CurrentChannel::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Sends a SkipChannel command to the DUT");
            VerifyOrDo(!ShouldSkip("CHANNEL.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Channel::Commands::SkipChannel::Type value;
            value.count = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Commands::SkipChannel::Id, value,
                               chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "Verify that the channel has changed on the device");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && CHANNEL.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>(
                "Please enter 'y' if channel has changed on the devicegarbage: not in length on purpose", 53);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6, "Reads the CurrentChannel attribute from the DUT");
            VerifyOrDo(!ShouldSkip("CHANNEL.S.A0002 && CHANNEL.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::CurrentChannel::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAPLAYBACK_6_1Suite : public TestCommand
{
public:
    Test_TC_MEDIAPLAYBACK_6_1Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_MEDIAPLAYBACK_6_1", 12, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MEDIAPLAYBACK_6_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::PlaybackStateEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentState", value, 1U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::PlaybackStateEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentState", value, 0U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::PlaybackStateEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentState", value, 1U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::PlaybackStateEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentState", value, 2U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Precondition: Media content in a paused state at the beginning of the content");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::Pause::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Commands::Pause::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Reads the CurrentState attribute");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.A0000 && MEDIAPLAYBACK.S.C01.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::CurrentState::Id,
                                 true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Sends a Play command");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::Play::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Commands::Play::Id, value,
                               chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Verify that the media state is playing");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Please enter 'y' if media state is playinggarbage: not in length on purpose", 42);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "Reads the CurrentState attribute");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.A0000 && MEDIAPLAYBACK.S.C00.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::CurrentState::Id,
                                 true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "sends a Pause command");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::Pause::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Commands::Pause::Id, value,
                               chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "Verify that the media is paused");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Please enter 'y' if media state is pausedgarbage: not in length on purpose", 41);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 8: {
            LogStep(8, "Reads the CurrentState attribute");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C01.Rsp && MEDIAPLAYBACK.S.A0000"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::CurrentState::Id,
                                 true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Sends a Stop command");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::StopPlayback::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Commands::StopPlayback::Id, value,
                               chip::NullOptional

            );
        }
        case 10: {
            LogStep(10, "Verify that the media is stoped");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Please enter 'y' if media state is stopedgarbage: not in length on purpose", 41);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 11: {
            LogStep(11, "Reads the CurrentState attribute");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.A0000 && MEDIAPLAYBACK.S.C02.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::CurrentState::Id,
                                 true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAPLAYBACK_6_2Suite : public TestCommand
{
public:
    Test_TC_MEDIAPLAYBACK_6_2Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_MEDIAPLAYBACK_6_2", 18, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MEDIAPLAYBACK_6_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::PlaybackStateEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentState", value, 1U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::PlaybackStateEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentState", value, 0U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::MediaPlayback::Structs::PlaybackPosition::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("sampledPosition", value));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::MediaPlayback::Structs::PlaybackPosition::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("sampledPosition", value));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Precondition: Media content in a paused state at the beginning of the content");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::Pause::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Commands::Pause::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Reads the CurrentState attribute from the DUT");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.A0000 && MEDIAPLAYBACK.S.C01.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::CurrentState::Id,
                                 true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Sends a Play command to the DUT");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::Play::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Commands::Play::Id, value,
                               chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Verify that the media state is playing");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Please enter 'y' if media state is playinggarbage: not in length on purpose", 42);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "Reads the CurrentState attribute");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.A0000 && MEDIAPLAYBACK.S.C00.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::CurrentState::Id,
                                 true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Sends a StartOver command to the DUT");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::StartOver::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Commands::StartOver::Id, value,
                               chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "Verify that the media is started over");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Please enter 'y' if media is started overgarbage: not in length on purpose", 41);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 8: {
            LogStep(8, "Sends a Next command to the DUT");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C05.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::Next::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Commands::Next::Id, value,
                               chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "Verify that the next media item in the queue has been loaded");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C05.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>(
                "Please enter 'y' if media item in the queue has been loadedgarbage: not in length on purpose", 59);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "Sends a Previous command to the DUT");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C04.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::Previous::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Commands::Previous::Id, value,
                               chip::NullOptional

            );
        }
        case 11: {
            LogStep(11, "Verify that the previous media item in the queue has been loaded");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C04.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>(
                "Please enter 'y' if previous media item in the queue has been loadedgarbage: not in length on purpose", 68);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 12: {
            LogStep(12, "Sends a SkipForward command to the DUT ");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C08.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::SkipForward::Type value;
            value.deltaPositionMilliseconds = 10000ULL;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Commands::SkipForward::Id, value,
                               chip::NullOptional

            );
        }
        case 13: {
            LogStep(13, "Verify that the media has skipped forward 10 seconds");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C08.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>(
                "Please enter 'y' if media has skipped forward 10 secondsgarbage: not in length on purpose", 56);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14, "Reads the SampledPosition attribute from the DUT");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.A0003 && MEDIAPLAYBACK.S.C08.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::SampledPosition::Id,
                                 true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Sends a SkipBackward command to the DUT ");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C09.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::SkipBackward::Type value;
            value.deltaPositionMilliseconds = 10000ULL;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Commands::SkipBackward::Id, value,
                               chip::NullOptional

            );
        }
        case 16: {
            LogStep(16, "Verify that the media has skipped backward 10 seconds");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C09.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>(
                "Please enter 'y' if media has skipped backward 10 secondsgarbage: not in length on purpose", 57);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17, "Reads the SampledPosition attribute from the DUT");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.A0003 && MEDIAPLAYBACK.S.C09.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::SampledPosition::Id,
                                 true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAPLAYBACK_6_3Suite : public TestCommand
{
public:
    Test_TC_MEDIAPLAYBACK_6_3Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_MEDIAPLAYBACK_6_3", 11, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("SeekPosition", 0, UINT64_MAX, &mSeekPosition);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MEDIAPLAYBACK_6_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint64_t> mSeekPosition;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::MediaPlayback::Structs::PlaybackPosition::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("sampledPosition", value));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 5U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Precondition: Media content in a paused state at the beginning of the content");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::Pause::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Commands::Pause::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Sends a Seek command");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C0B.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::Seek::Type value;
            value.position = 10000ULL;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Commands::Seek::Id, value,
                               chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "Verify that the media has moved to 10 seconds from the starting point");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C0B.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>(
                "Please enter 'y' if media has moved to 10 seconds from the starting pointgarbage: not in length on purpose", 73);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 4: {
            LogStep(4, "Reads the SampledPosition attribute");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.A0003 && MEDIAPLAYBACK.S.C0B.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::SampledPosition::Id,
                                 true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads the StartTime attribute from the DUT");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.A0001 && PICS_USER_PROMPT"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6, "TH reads the SeekRangeEnd attribute from the DUT");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "TH reads the SeekRangeStart attribute from the DUT");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 8: {
            LogStep(8, "TH reads the Duration attribute from the DUT");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "Sends a Seek command Position value beyond the furthest valid position");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C0B.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::Seek::Type value;
            value.position = mSeekPosition.HasValue() ? mSeekPosition.Value() : 100000000ULL;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Commands::Seek::Id, value,
                               chip::NullOptional

            );
        }
        case 10: {
            LogStep(10, "verify that the media has not moved.");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C0B.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' if media has not movedgarbage: not in length on purpose", 39);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAPLAYBACK_6_4Suite : public TestCommand
{
public:
    Test_TC_MEDIAPLAYBACK_6_4Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_MEDIAPLAYBACK_6_4", 23, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MEDIAPLAYBACK_6_4Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::PlaybackStateEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentState", value, 1U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                float value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("playbackSpeed", value, 0.0f));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::PlaybackStateEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentState", value, 0U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                float value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("playbackSpeed", value, 1.0f));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                float value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("playbackSpeed", value, 2.0f));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::PlaybackStateEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentState", value, 0U));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                float value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("playbackSpeed", value, 1.0f));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Precondition: Media content in a paused state at the beginning of the content");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::Pause::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Commands::Pause::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Reads the CurrentState attribute from the DUT");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.A0000 && MEDIAPLAYBACK.S.C01.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::CurrentState::Id,
                                 true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Reads the PlaybackSpeed attribute from the DUT");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.A0004 && MEDIAPLAYBACK.S.C01.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::PlaybackSpeed::Id,
                                 true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Sends a FastForward command");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::FastForward::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Commands::FastForward::Id, value,
                               chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "verify that the media state is playing");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Please enter 'y' if media state is playinggarbage: not in length on purpose", 42);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6, "Reads the CurrentState attribute");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.A0000 && MEDIAPLAYBACK.S.C07.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::CurrentState::Id,
                                 true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Reads the PlaybackSpeed attribute from the DUT");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.A0004 && MEDIAPLAYBACK.S.C07.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::PlaybackSpeed::Id,
                                 true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Sends a FastForward command");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::FastForward::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Commands::FastForward::Id, value,
                               chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "verify that the media play speed has increased.");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Please enter 'y' if media play speed has increased.garbage: not in length on purpose", 51);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "Reads the PlaybackSpeed attribute from the DUT");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.A0004 && MEDIAPLAYBACK.S.C07.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::PlaybackSpeed::Id,
                                 true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Sends a Rewind command to the DUT");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::Rewind::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Commands::Rewind::Id, value,
                               chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "verify that the media play has reversed direction.");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>(
                "Please enter 'y' if media play has reversed directiongarbage: not in length on purpose", 53);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "Reads the CurrentState attribute");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.A0000 && MEDIAPLAYBACK.S.C06.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::CurrentState::Id,
                                 true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Reads the PlaybackSpeed attribute from the DUT");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.A0004 && MEDIAPLAYBACK.S.C06.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Please enter 'y' if PlaybackSpeed value is -1garbage: not in length on purpose", 45);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 15: {
            LogStep(15, "Sends a Rewind command to the DUT");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::Rewind::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Commands::Rewind::Id, value,
                               chip::NullOptional

            );
        }
        case 16: {
            LogStep(16, "verify that the media play speed has increased in the reverse direction.");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>(
                "Please enter 'y' if media play speed has increased in the reverse directiongarbage: not in length on purpose", 75);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17, "Reads the PlaybackSpeed attribute from the DUT");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.A0004 && MEDIAPLAYBACK.S.C06.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Please enter 'y' if PlaybackSpeed value is -2garbage: not in length on purpose", 45);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 18: {
            LogStep(18, "Sends a Play command");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::Play::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Commands::Play::Id, value,
                               chip::NullOptional

            );
        }
        case 19: {
            LogStep(19, "verify that the media is has resumed playing forward at the default speed.");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>(
                "Please enter 'y' if media is has resumed playing forward at the default speedgarbage: not in length on purpose",
                77);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 20: {
            LogStep(20, "Reads the PlaybackSpeed attribute from the DUT");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.A0004 && MEDIAPLAYBACK.S.C00.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::PlaybackSpeed::Id,
                                 true, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "Sends consecutive FastForward commands");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 22: {
            LogStep(22, "Sends consecutive Rewind commands");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_AUDIOOUTPUT_7_1Suite : public TestCommand
{
public:
    Test_TC_AUDIOOUTPUT_7_1Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_AUDIOOUTPUT_7_1", 4, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("Index", 0, UINT8_MAX, &mIndex);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_AUDIOOUTPUT_7_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint8_t> mIndex;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::AudioOutput::Structs::OutputInfo::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentOutput", value, mIndex.HasValue() ? mIndex.Value() : 1U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Reads the OutputList attribute");
            VerifyOrDo(!ShouldSkip("AUDIOOUTPUT.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), AudioOutput::Id, AudioOutput::Attributes::OutputList::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Sends a SelectAudioOutput command");
            VerifyOrDo(!ShouldSkip("AUDIOOUTPUT.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AudioOutput::Commands::SelectOutput::Type value;
            value.index = mIndex.HasValue() ? mIndex.Value() : 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), AudioOutput::Id, AudioOutput::Commands::SelectOutput::Id, value,
                               chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "Reads the CurrentOutput attribute");
            VerifyOrDo(!ShouldSkip("AUDIOOUTPUT.S.A0001 && AUDIOOUTPUT.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), AudioOutput::Id, AudioOutput::Attributes::CurrentOutput::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_AUDIOOUTPUT_7_2Suite : public TestCommand
{
public:
    Test_TC_AUDIOOUTPUT_7_2Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_AUDIOOUTPUT_7_2", 4, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("Index", 0, UINT8_MAX, &mIndex);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_AUDIOOUTPUT_7_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint8_t> mIndex;
    chip::Optional<uint16_t> mTimeout;

    chip::app::DataModel::DecodableList<chip::app::Clusters::AudioOutput::Structs::OutputInfo::DecodableType> audioOutputListValues;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::AudioOutput::Structs::OutputInfo::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                audioOutputListValues = value;
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Reads the OutputList attribute from the DUT");
            VerifyOrDo(!ShouldSkip("AUDIOOUTPUT.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), AudioOutput::Id, AudioOutput::Attributes::OutputList::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Sends a RenameOutput command");
            VerifyOrDo(!ShouldSkip("AUDIOOUTPUT.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AudioOutput::Commands::RenameOutput::Type value;
            value.index = mIndex.HasValue() ? mIndex.Value() : 1U;
            value.name  = chip::Span<const char>("CertTestgarbage: not in length on purpose", 8);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), AudioOutput::Id, AudioOutput::Commands::RenameOutput::Id, value,
                               chip::NullOptional

            );
        }
        case 3: {
            LogStep(3,
                    "Reads the OutputList attribute from the DUT Verify that the output at the index provided in step 2 has the "
                    "name CertTest");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && AUDIOOUTPUT.S.A0001 && AUDIOOUTPUT.S.C01.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_TGTNAV_8_1Suite : public TestCommand
{
public:
    Test_TC_TGTNAV_8_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_TGTNAV_8_1", 5, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("targetvalue", 0, UINT8_MAX, &mTargetvalue);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_TGTNAV_8_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint8_t> mTargetvalue;
    chip::Optional<uint16_t> mTimeout;

    chip::app::DataModel::DecodableList<chip::app::Clusters::TargetNavigator::Structs::TargetInfo::DecodableType> TargetListValues;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::TargetNavigator::Structs::TargetInfo::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                TargetListValues = value;
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::TargetNavigator::Commands::NavigateTargetResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentTarget", value, mTargetvalue.HasValue() ? mTargetvalue.Value() : 1U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Reads the CurrentTarget attribute");
            VerifyOrDo(!ShouldSkip("TGTNAV.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TargetNavigator::Id,
                                 TargetNavigator::Attributes::CurrentTarget::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Reads the TargetList attribute");
            VerifyOrDo(!ShouldSkip("TGTNAV.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TargetNavigator::Id, TargetNavigator::Attributes::TargetList::Id,
                                 true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Sends a NavigateTarget command");
            VerifyOrDo(!ShouldSkip("TGTNAV.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::TargetNavigator::Commands::NavigateTarget::Type value;
            value.target = mTargetvalue.HasValue() ? mTargetvalue.Value() : 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), TargetNavigator::Id, TargetNavigator::Commands::NavigateTarget::Id,
                               value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Reads the CurrentTarget attribute");
            VerifyOrDo(!ShouldSkip("TGTNAV.S.A0001 && TGTNAV.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TargetNavigator::Id,
                                 TargetNavigator::Attributes::CurrentTarget::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_APBSC_9_1Suite : public TestCommand
{
public:
    Test_TC_APBSC_9_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_APBSC_9_1", 9, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_APBSC_9_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 32));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::VendorId value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "vendor_id", "vendor_id"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 256));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::ApplicationBasic::Structs::ApplicationBasicApplication::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "ApplicationBasicApplication", "ApplicationBasicApplication"));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::ApplicationBasic::ApplicationStatusEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 32));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::VendorId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Reads the VendorName attribute");
            VerifyOrDo(!ShouldSkip("APBSC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id, ApplicationBasic::Attributes::VendorName::Id,
                                 true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Reads the VendorID attribute");
            VerifyOrDo(!ShouldSkip("APBSC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id, ApplicationBasic::Attributes::VendorID::Id,
                                 true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Reads the ApplicationName attribute");
            VerifyOrDo(!ShouldSkip("APBSC.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id,
                                 ApplicationBasic::Attributes::ApplicationName::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Reads the ProductID attribute");
            VerifyOrDo(!ShouldSkip("APBSC.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id, ApplicationBasic::Attributes::ProductID::Id,
                                 true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Reads the Application attribute");
            VerifyOrDo(!ShouldSkip("APBSC.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id,
                                 ApplicationBasic::Attributes::Application::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Reads the Status attribute");
            VerifyOrDo(!ShouldSkip("APBSC.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id, ApplicationBasic::Attributes::Status::Id,
                                 true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Reads the ApplicationVersion attribute");
            VerifyOrDo(!ShouldSkip("APBSC.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id,
                                 ApplicationBasic::Attributes::ApplicationVersion::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Reads the AllowedVendorList attribute");
            VerifyOrDo(!ShouldSkip("APBSC.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id,
                                 ApplicationBasic::Attributes::AllowedVendorList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CONTENTLAUNCHER_10_1Suite : public TestCommand
{
public:
    Test_TC_CONTENTLAUNCHER_10_1Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CONTENTLAUNCHER_10_1", 3, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CONTENTLAUNCHER_10_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CharSpan> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH reads the AcceptHeader attribute from the DUT");
            VerifyOrDo(!ShouldSkip("CONTENTLAUNCHER.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ContentLauncher::Id, ContentLauncher::Attributes::AcceptHeader::Id,
                                 true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads the SupportedStreamingProtocols attribute from the DUT");
            VerifyOrDo(!ShouldSkip("CONTENTLAUNCHER.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ContentLauncher::Id,
                                 ContentLauncher::Attributes::SupportedStreamingProtocols::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MOD_1_1Suite : public TestCommand
{
public:
    Test_TC_MOD_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_MOD_1_1", 9, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MOD_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 1UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH reads the ClusterRevision attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::ClusterRevision::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads the FeatureMap attribute from the DUT");
            VerifyOrDo(!ShouldSkip("MOD.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH reads the FeatureMap attribute from the DUT");
            VerifyOrDo(!ShouldSkip(" !MOD.S.F00 "), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads the AttributeList attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads the optional attribute(StartUpMode) in AttributeList from the DUT");
            VerifyOrDo(!ShouldSkip("MOD.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH reads the optional attribute(OnMode) in AttributeList from the DUT");
            VerifyOrDo(!ShouldSkip("MOD.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::AcceptedCommandList::Id,
                                 true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::GeneratedCommandList::Id,
                                 true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class OTA_SuccessfulTransferSuite : public TestCommand
{
public:
    OTA_SuccessfulTransferSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("OTA_SuccessfulTransfer", 11, credsIssuerConfig)
    {
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("requestorNodeId", 0, UINT64_MAX, &mRequestorNodeId);
        AddArgument("providerNodeId", 0, UINT64_MAX, &mProviderNodeId);
        AddArgument("providerPayload", &mProviderPayload);
        AddArgument("providerDiscriminator", 0, UINT16_MAX, &mProviderDiscriminator);
        AddArgument("providerPort", 0, UINT16_MAX, &mProviderPort);
        AddArgument("providerKvs", &mProviderKvs);
        AddArgument("otaImageFilePath", &mOtaImageFilePath);
        AddArgument("rawImageFilePath", &mRawImageFilePath);
        AddArgument("rawImageContent", &mRawImageContent);
        AddArgument("downloadImageFilePath", &mDownloadImageFilePath);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~OTA_SuccessfulTransferSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<chip::NodeId> mRequestorNodeId;
    chip::Optional<chip::NodeId> mProviderNodeId;
    chip::Optional<chip::CharSpan> mProviderPayload;
    chip::Optional<uint16_t> mProviderDiscriminator;
    chip::Optional<uint16_t> mProviderPort;
    chip::Optional<chip::CharSpan> mProviderKvs;
    chip::Optional<chip::CharSpan> mOtaImageFilePath;
    chip::Optional<chip::CharSpan> mRawImageFilePath;
    chip::Optional<chip::CharSpan> mRawImageContent;
    chip::Optional<chip::CharSpan> mDownloadImageFilePath;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Create OTA image");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::CreateOtaImage::Type value;
            value.otaImageFilePath =
                mOtaImageFilePath.HasValue() ? mOtaImageFilePath.Value() : chip::Span<const char>("/tmp/otaImage", 13);
            value.rawImageFilePath =
                mRawImageFilePath.HasValue() ? mRawImageFilePath.Value() : chip::Span<const char>("/tmp/rawImage", 13);
            value.rawImageContent =
                mRawImageContent.HasValue() ? mRawImageContent.Value() : chip::Span<const char>("Have a hootenanny!", 18);
            return CreateOtaImage(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Start the provider with an image");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Start::Type value;
            value.registerKey.Emplace();
            value.registerKey.Value() = chip::Span<const char>("chip-ota-provider-appgarbage: not in length on purpose", 21);
            value.discriminator.Emplace();
            value.discriminator.Value() = mProviderDiscriminator.HasValue() ? mProviderDiscriminator.Value() : 50U;
            value.port.Emplace();
            value.port.Value() = mProviderPort.HasValue() ? mProviderPort.Value() : 5560U;
            value.kvs.Emplace();
            value.kvs.Value() =
                mProviderKvs.HasValue() ? mProviderKvs.Value() : chip::Span<const char>("/tmp/chip_kvs_provider", 22);
            value.filepath.Emplace();
            value.filepath.Value() =
                mOtaImageFilePath.HasValue() ? mOtaImageFilePath.Value() : chip::Span<const char>("/tmp/otaImage", 13);
            return Start(kIdentityAlpha, value);
        }
        case 2: {
            LogStep(2, "Commission the provider from alpha");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId = mProviderNodeId.HasValue() ? mProviderNodeId.Value() : 12648430ULL;
            value.payload =
                mProviderPayload.HasValue() ? mProviderPayload.Value() : chip::Span<const char>("MT:-24J0IX4122-.548G00", 22);
            return PairWithCode(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "Wait for the commissioned provider to be retrieved for alpha");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mProviderNodeId.HasValue() ? mProviderNodeId.Value() : 12648430ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 4: {
            LogStep(4, "Install ACL for QueryImage");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(5);
                listHolder_0->mList[0].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 112233ULL;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 1U;

                listHolder_0->mList[1].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(3);
                listHolder_0->mList[1].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(2);
                listHolder_0->mList[1].subjects.SetNull();
                listHolder_0->mList[1].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(1);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNonNull();
                    listHolder_3->mList[0].cluster.Value() = 41UL;
                    listHolder_3->mList[0].endpoint.SetNull();
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_0->mList[1].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              1);
                }
                listHolder_0->mList[1].fabricIndex = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Stop the requestor");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Stop::Type value;
            return Stop(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6, "Start the requestor with an OTA download path");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Start::Type value;
            value.otaDownloadPath.Emplace();
            value.otaDownloadPath.Value() = mDownloadImageFilePath.HasValue() ? mDownloadImageFilePath.Value()
                                                                              : chip::Span<const char>("/tmp/downloadedImage", 20);
            return Start(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "Wait for the commissioned requestor to be retrieved for alpha");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mRequestorNodeId.HasValue() ? mRequestorNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 8: {
            LogStep(8, "Send an announce OTA provider command to the requestor");
            ListFreer listFreer;
            chip::app::Clusters::OtaSoftwareUpdateRequestor::Commands::AnnounceOtaProvider::Type value;
            value.providerNodeId     = mProviderNodeId.HasValue() ? mProviderNodeId.Value() : 12648430ULL;
            value.vendorId           = static_cast<chip::VendorId>(0);
            value.announcementReason = static_cast<chip::app::Clusters::OtaSoftwareUpdateRequestor::OTAAnnouncementReason>(0);
            value.endpoint           = mEndpoint.HasValue() ? mEndpoint.Value() : 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), OtaSoftwareUpdateRequestor::Id,
                               OtaSoftwareUpdateRequestor::Commands::AnnounceOtaProvider::Id, value, chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "Wait for transfer complete message");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMessage::Type value;
            value.registerKey.Emplace();
            value.registerKey.Value() = chip::Span<const char>("defaultgarbage: not in length on purpose", 7);
            value.message             = chip::Span<const char>("OTA image downloadedgarbage: not in length on purpose", 20);
            return WaitForMessage(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "Compare original file to downloaded file");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::CompareFiles::Type value;
            value.file1 = mRawImageFilePath.HasValue() ? mRawImageFilePath.Value() : chip::Span<const char>("/tmp/rawImage", 13);
            value.file2 = mDownloadImageFilePath.HasValue() ? mDownloadImageFilePath.Value()
                                                            : chip::Span<const char>("/tmp/downloadedImage", 20);
            return CompareFiles(kIdentityAlpha, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_OCC_1_1Suite : public TestCommand
{
public:
    Test_TC_OCC_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_OCC_1_1", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_OCC_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 3U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OccupancySensing::Id,
                                 OccupancySensing::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OccupancySensing::Id, OccupancySensing::Attributes::FeatureMap::Id,
                                 true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OccupancySensing::Id,
                                 OccupancySensing::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OccupancySensing::Id,
                                 OccupancySensing::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OccupancySensing::Id,
                                 OccupancySensing::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_OCC_2_1Suite : public TestCommand
{
public:
    Test_TC_OCC_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_OCC_2_1", 13, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_OCC_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 1U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 7U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Reads mandatory attribute constrains: Occupancy");
            VerifyOrDo(!ShouldSkip("OCC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OccupancySensing::Id, OccupancySensing::Attributes::Occupancy::Id,
                                 true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Reads mandatory attribute constrains: OccupancySensorType");
            VerifyOrDo(!ShouldSkip("OCC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OccupancySensing::Id,
                                 OccupancySensing::Attributes::OccupancySensorType::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Reads mandatory attribute constrains: OccupancySensorTypeBitmap");
            VerifyOrDo(!ShouldSkip("OCC.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OccupancySensing::Id,
                                 OccupancySensing::Attributes::OccupancySensorTypeBitmap::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Reads optional attribute: PIROccupiedToUnoccupiedDelay");
            VerifyOrDo(!ShouldSkip("OCC.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OccupancySensing::Id,
                                 OccupancySensing::Attributes::PirOccupiedToUnoccupiedDelay::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Reads optional attribute constrains: PIRUnoccupiedToOccupiedDelay");
            VerifyOrDo(!ShouldSkip("OCC.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OccupancySensing::Id,
                                 OccupancySensing::Attributes::PirUnoccupiedToOccupiedDelay::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Reads optional attribute constrains: PIRUnoccupiedToOccupiedThreshold");
            VerifyOrDo(!ShouldSkip("OCC.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OccupancySensing::Id,
                                 OccupancySensing::Attributes::PirUnoccupiedToOccupiedThreshold::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read optional attribute: UltrasonicOccupiedToUnoccupiedDelay");
            VerifyOrDo(!ShouldSkip("OCC.S.A0020"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OccupancySensing::Id,
                                 OccupancySensing::Attributes::UltrasonicOccupiedToUnoccupiedDelay::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read attribute: UltrasonicUnoccupiedToOccupiedDelay");
            VerifyOrDo(!ShouldSkip("OCC.S.A0021"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OccupancySensing::Id,
                                 OccupancySensing::Attributes::UltrasonicUnoccupiedToOccupiedDelay::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Read attribute: UltrasonicUnoccupiedToOccupiedThreshold");
            VerifyOrDo(!ShouldSkip("OCC.S.A0022"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OccupancySensing::Id,
                                 OccupancySensing::Attributes::UltrasonicUnoccupiedToOccupiedThreshold::Id, true,
                                 chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Reads optional attribute constrains: PhysicalContactOccupiedToUnoccupiedDelay");
            VerifyOrDo(!ShouldSkip("OCC.S.A0030"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OccupancySensing::Id,
                                 OccupancySensing::Attributes::PhysicalContactOccupiedToUnoccupiedDelay::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Reads optional attribute constrains: PhysicalContactUnoccupiedToOccupiedDelay");
            VerifyOrDo(!ShouldSkip("OCC.S.A0031"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OccupancySensing::Id,
                                 OccupancySensing::Attributes::PhysicalContactUnoccupiedToOccupiedDelay::Id, true,
                                 chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Reads optional attribute constrains: PhysicalContactUnoccupiedToOccupiedThreshold");
            VerifyOrDo(!ShouldSkip("OCC.S.A0032"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OccupancySensing::Id,
                                 OccupancySensing::Attributes::PhysicalContactUnoccupiedToOccupiedThreshold::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_OO_1_1Suite : public TestCommand
{
public:
    Test_TC_OO_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_OO_1_1", 9, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_OO_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 4U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 16384UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 16385UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 16386UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 16387UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 64UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 66UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::ClusterRevision::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            VerifyOrDo(!ShouldSkip(" !OO.S.F00 "), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Given OO.S.F00(LT) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("OO.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the feature dependent(OO.S.F00) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("OO.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read the feature dependent(OO.S.F00) commands in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("OO.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::GeneratedCommandList::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_OO_2_1Suite : public TestCommand
{
public:
    Test_TC_OO_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_OO_2_1", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_OO_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "boolean", "boolean"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "boolean", "boolean"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::OnOff::OnOffStartUpOnOff> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read the mandatory attribute: OnOff");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read LT attribute: GlobalSceneControl");
            VerifyOrDo(!ShouldSkip("OO.S.A4000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::GlobalSceneControl::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read LT attribute: OnTime");
            VerifyOrDo(!ShouldSkip("OO.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnTime::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read LT attribute: OffWaitTime");
            VerifyOrDo(!ShouldSkip("OO.S.A4002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OffWaitTime::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read LT attribute: StartUpOnOff");
            VerifyOrDo(!ShouldSkip("OO.S.A4003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::StartUpOnOff::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_OO_2_2Suite : public TestCommand
{
public:
    Test_TC_OO_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_OO_2_2", 23, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_OO_2_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Send Off Command");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Send On Command");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Check on/off attribute value is true after on command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Send On Command");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Check on/off attribute value is true after on command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Send Off Command");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Send Off Command");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 10: {
            LogStep(10, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Send Toggle Command");
            VerifyOrDo(!ShouldSkip("OO.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Toggle::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Toggle::Id, value, chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "Wait 1000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "Check on/off attribute value is true after toggle command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Send Toggle Command");
            VerifyOrDo(!ShouldSkip("OO.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Toggle::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Toggle::Id, value, chip::NullOptional

            );
        }
        case 15: {
            LogStep(15, "Wait 1000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 16: {
            LogStep(16, "Check on/off attribute value is false after toggle command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Operate on device to set OnOff attribute manually to on");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && OO.M.ManuallyControlled && OO.S.A0000"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 18: {
            LogStep(18, "Check on/off attribute value is true after on command");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && OO.S.A0000 && OO.M.ManuallyControlled"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Operate on device to set OnOff attribute manually to off");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && OO.M.ManuallyControlled && OO.S.A0000"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 20: {
            LogStep(20, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && OO.S.A0000 && OO.M.ManuallyControlled"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "Reset Off Command");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 22: {
            LogStep(22, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_OO_2_4Suite : public TestCommand
{
public:
    Test_TC_OO_2_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_OO_2_4", 31, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_OO_2_4Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "TH writes a value of 0 to StartUpOnOff attribute of DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::app::Clusters::OnOff::OnOffStartUpOnOff> value;
            value.SetNonNull();
            value.Value() = static_cast<chip::app::Clusters::OnOff::OnOffStartUpOnOff>(0);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::StartUpOnOff::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Reboot target device");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
            return Reboot(kIdentityAlpha, value);
        }
        case 4: {
            LogStep(4, "Reboot target device(DUT)");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Please reboot the DUT and enter 'y' after DUT startsgarbage: not in length on purpose", 52);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6, "TH reads the OnOff attribute from the DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH writes a value of 1 to StartUpOnOff attribute of DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::app::Clusters::OnOff::OnOffStartUpOnOff> value;
            value.SetNonNull();
            value.Value() = static_cast<chip::app::Clusters::OnOff::OnOffStartUpOnOff>(1);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::StartUpOnOff::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Reboot target device");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
            return Reboot(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "Reboot target device(DUT)");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Please reboot the DUT and enter 'y' after DUT startsgarbage: not in length on purpose", 52);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 11: {
            LogStep(11, "TH reads the OnOff attribute from the DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "TH writes a value of 2 to StartUpOnOff attribute of DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::app::Clusters::OnOff::OnOffStartUpOnOff> value;
            value.SetNonNull();
            value.Value() = static_cast<chip::app::Clusters::OnOff::OnOffStartUpOnOff>(2);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::StartUpOnOff::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Reboot target device");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
            return Reboot(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14, "Reboot target device(DUT)");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Please reboot the DUT and enter 'y' after DUT startsgarbage: not in length on purpose", 52);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 15: {
            LogStep(15, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 16: {
            LogStep(16, "TH reads the OnOff attribute from the DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Reboot target device");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
            return Reboot(kIdentityAlpha, value);
        }
        case 18: {
            LogStep(18, "Reboot target device(DUT)");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Please reboot the DUT and enter 'y' after DUT startsgarbage: not in length on purpose", 52);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 19: {
            LogStep(19, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 20: {
            LogStep(20, "TH reads the OnOff attribute from the DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "TH writes NULL to StartUpOnOff attribute of DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::app::Clusters::OnOff::OnOffStartUpOnOff> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::StartUpOnOff::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Reboot target device");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
            return Reboot(kIdentityAlpha, value);
        }
        case 23: {
            LogStep(23, "Reboot target device(DUT)");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Please reboot the DUT and enter 'y' after DUT startsgarbage: not in length on purpose", 52);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 24: {
            LogStep(24, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 25: {
            LogStep(25, "TH reads the OnOff attribute from the DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 26: {
            LogStep(26, "TH sends Off command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 27: {
            LogStep(27, "Reboot target device");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
            return Reboot(kIdentityAlpha, value);
        }
        case 28: {
            LogStep(28, "Reboot target device(DUT)");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Please reboot the DUT and enter 'y' after DUT startsgarbage: not in length on purpose", 52);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 29: {
            LogStep(29, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 30: {
            LogStep(30, "TH reads the OnOff attribute from the DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_PS_1_1Suite : public TestCommand
{
public:
    Test_TC_PS_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_PS_1_1", 14, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_PS_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 2UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 2UL));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 4UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 2UL));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 8UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 14UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 15UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 16UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 26UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 28UL));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 19UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 25UL));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::ClusterRevision::Id,
                                 true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            VerifyOrDo(!ShouldSkip(" !PS.S.F00 && !PS.S.F01 && !PS.S.F02 && !PS.S.F03 "),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Given PS.S.F00(WIRED) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("PS.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Given PS.S.F01(BAT) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("PS.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Given PS.S.F02(RECHG) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("PS.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Given PS.S.F03(REPLC) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("PS.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read the Feature dependent(PS.S.F00-WIRED) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("PS.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Read the Feature dependent(PS.S.F01-BAT) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("PS.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Read the Feature dependent(PS.S.F02-RECHG) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("PS.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Read the Feature dependent(PS.S.F03-REPLC) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("PS.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::AcceptedCommandList::Id,
                                 true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::GeneratedCommandList::Id,
                                 true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_PS_2_1Suite : public TestCommand
{
public:
    Test_TC_PS_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_PS_2_1", 32, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_PS_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::PowerSource::PowerSourceStatus value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::PowerSource::WiredCurrentType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 1U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "boolean", "boolean"));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::PowerSource::WiredFault> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 8));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 200U));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::PowerSource::BatChargeLevel value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "boolean", "boolean"));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::PowerSource::BatReplaceability value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "boolean", "boolean"));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::PowerSource::BatFault> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 8));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 60));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 80UL));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 20));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 20));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32UL));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::PowerSource::BatChargeState value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "boolean", "boolean"));
            }
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::PowerSource::BatChargeFault> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Test Harness Client reads Status attribute from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::Status::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Test Harness Client reads Order attribute from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::Order::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Test Harness Client reads Description attribute from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::Description::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Test Harness Client reads WiredAssessedInputVoltage attribue from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id,
                                 PowerSource::Attributes::WiredAssessedInputVoltage::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Test Harness Client reads WiredAssessedInputFrequency attribute from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id,
                                 PowerSource::Attributes::WiredAssessedInputFrequency::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Test Harness Client reads WiredCurrentType attribute from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::WiredCurrentType::Id,
                                 true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Test Harness Client reads WiredAssessedCurrent attribute from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::WiredAssessedCurrent::Id,
                                 true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Test Harness Client reads WiredNominalVoltage from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::WiredNominalVoltage::Id,
                                 true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Test Harness Client reads WiredMaximumCurrent from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::WiredMaximumCurrent::Id,
                                 true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Test Harness Client reads WiredPresent from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A0009"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::WiredPresent::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Test Harness Client reads ActiveWiredFaults from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::ActiveWiredFaults::Id,
                                 true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Test Harness Client reads BatVoltage from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A000b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::BatVoltage::Id, true,
                                 chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Test Harness Client reads BatPercentRemaining from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A000c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::BatPercentRemaining::Id,
                                 true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Test Harness Client reads BatTimeRemaining from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A000d"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::BatTimeRemaining::Id,
                                 true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Test Harness Client reads BatChargeLevel from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::BatChargeLevel::Id, true,
                                 chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Test Harness Client reads BatReplacementNeeded from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::BatReplacementNeeded::Id,
                                 true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Test Harness Client reads BatReplaceability from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::BatReplaceability::Id,
                                 true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Test Harness Client reads BatPresent from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::BatPresent::Id, true,
                                 chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Test Harness Client readsActiveBatFaults from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::ActiveBatFaults::Id,
                                 true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Test Harness Client reads BatReplacementDescription from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A0013"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id,
                                 PowerSource::Attributes::BatReplacementDescription::Id, true, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "Test Harness Client reads BatCommonDesignation from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A0014"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::BatCommonDesignation::Id,
                                 true, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Test Harness Client reads BatANSIDesignation from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::BatANSIDesignation::Id,
                                 true, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "Test Harness Client reads BatIECDesignation from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A0016"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::BatIECDesignation::Id,
                                 true, chip::NullOptional);
        }
        case 24: {
            LogStep(24, "Test Harness Client reads BatApprovedChemistry from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::BatApprovedChemistry::Id,
                                 true, chip::NullOptional);
        }
        case 25: {
            LogStep(25, "Test Harness Client reads BatCapacity from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A0018"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::BatCapacity::Id, true,
                                 chip::NullOptional);
        }
        case 26: {
            LogStep(26, "Test Harness Client reads BatQuantity from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A0019"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::BatQuantity::Id, true,
                                 chip::NullOptional);
        }
        case 27: {
            LogStep(27, "Test Harness Client reads BatChargeState from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A001a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::BatChargeState::Id, true,
                                 chip::NullOptional);
        }
        case 28: {
            LogStep(28, "Test Harness Client reads BatTimeToFullCharge from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A001b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::BatTimeToFullCharge::Id,
                                 true, chip::NullOptional);
        }
        case 29: {
            LogStep(29, "Test Harness Client reads BatFunctionalWhileCharging from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A001c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id,
                                 PowerSource::Attributes::BatFunctionalWhileCharging::Id, true, chip::NullOptional);
        }
        case 30: {
            LogStep(30, "Test Harness Client reads BatChargingCurrent from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A001d"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::BatChargingCurrent::Id,
                                 true, chip::NullOptional);
        }
        case 31: {
            LogStep(31, "Test Harness Client reads ActiveBatChargeFaults from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A001e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id,
                                 PowerSource::Attributes::ActiveBatChargeFaults::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_PRS_1_1Suite : public TestCommand
{
public:
    Test_TC_PRS_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_PRS_1_1", 13, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_PRS_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 3U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 16UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 17UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 18UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 20UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 19UL));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            VerifyOrDo(!ShouldSkip(" !PRS.S.F00 "), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Given PRS.S.F00(EXT) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("PRS.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the global mandatory attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the optional attribute(ScaledValue) in AttributeList");
            VerifyOrDo(!ShouldSkip("PRS.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read the optional attribute(MinScaledValue) in AttributeList");
            VerifyOrDo(!ShouldSkip("PRS.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read the optional attribute(MaxScaledValue) in AttributeList");
            VerifyOrDo(!ShouldSkip("PRS.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read the optional attribute(Scale) in AttributeList");
            VerifyOrDo(!ShouldSkip("PRS.S.A0014"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Read the optional attribute(Tolerance) in AttributeList");
            VerifyOrDo(!ShouldSkip("PRS.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Read the optional attribute(ScaledTolerance) in AttributeList");
            VerifyOrDo(!ShouldSkip("PRS.S.A0013"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_PRS_2_1Suite : public TestCommand
{
public:
    Test_TC_PRS_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_PRS_2_1", 10, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_PRS_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -32768));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -32768));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -32768));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2048U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -32768));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -32768));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -32768));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2048U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8s", "int8s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -127));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 127));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read the mandatory attribute constraints: MeasuredValue");
            VerifyOrDo(!ShouldSkip("PRS.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::MeasuredValue::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the mandatory attribute constraints: MinMeasuredValue");
            VerifyOrDo(!ShouldSkip("PRS.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::MinMeasuredValue::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the mandatory attribute constraints: MaxMeasuredValue");
            VerifyOrDo(!ShouldSkip("PRS.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::MaxMeasuredValue::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the optional attribute: Tolerance");
            VerifyOrDo(!ShouldSkip("PRS.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::Tolerance::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the optional attribute: ScaledValue");
            VerifyOrDo(!ShouldSkip("PRS.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::ScaledValue::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read the optional attribute: MinScaledValue");
            VerifyOrDo(!ShouldSkip("PRS.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::MinScaledValue::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read the optional attribute: MaxScaledValue");
            VerifyOrDo(!ShouldSkip("PRS.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::MaxScaledValue::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read the optional attribute: ScaledTolerance");
            VerifyOrDo(!ShouldSkip("PRS.S.A0013"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::ScaledTolerance::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Read the optional attribute: Scale");
            VerifyOrDo(!ShouldSkip("PRS.S.A0014"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::Scale::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_PRS_2_2Suite : public TestCommand
{
public:
    Test_TC_PRS_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_PRS_2_2", 5, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_PRS_2_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::app::DataModel::Nullable<int16_t> ValueBeforeChange;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                ValueBeforeChange = value;
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, ValueBeforeChange));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH reads from the DUT the MeasuredValue attribute");
            VerifyOrDo(!ShouldSkip("PRS.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::MeasuredValue::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Operate on device to change the pressure significantly");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && PRS.M.PressureChange"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "Wait 2s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 2000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 4: {
            LogStep(4, "After a few seconds, TH reads from the DUT the MeasuredValue attribute");
            VerifyOrDo(!ShouldSkip("PRS.S.A0000 && PRS.M.PressureChange"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::MeasuredValue::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_PCC_1_1Suite : public TestCommand
{
public:
    Test_TC_PCC_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_PCC_1_1", 22, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_PCC_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 3U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 17UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 18UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 19UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 32UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 6UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 7UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 8UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 9UL));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 10UL));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 11UL));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 12UL));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 16UL));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 20UL));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 21UL));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 22UL));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 23UL));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 33UL));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH reads the ClusterRevision attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads the FeatureMap attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH reads the AttributeList attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads optional attribute(MinConstPressure) attribute in AttributeList from the DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads optional attribute(MaxConstPressure) attribute in AttributeList from the DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH reads optional attribute(MinCompPressure) attribute in AttributeList from the DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH reads optional attribute(MaxCompPressure) attribute in AttributeList from the DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH reads optional attribute(MinConstSpeed) attribute in AttributeList from the DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "TH reads optional attribute(MaxConstSpeed) attribute in AttributeList from the DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "TH reads optional attribute(MinConstFlow) attribute in AttributeList from the DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0009"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "TH reads optional attribute(MaxConstFlow) attribute in AttributeList from the DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "TH reads optional attribute(MinConstTemp) attribute in AttributeList from the DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A000b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "TH reads optional attribute(MaxConstTemp) attribute in AttributeList from the DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A000c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "TH reads optional attribute(PumpStatus) attribute in AttributeList from the DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "TH reads optional attribute(Speed) attribute in AttributeList from the DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0014"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "TH reads optional attribute(LifetimeRunningHours) attribute in AttributeList from the DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "TH reads optional attribute(Power) attribute in AttributeList from the DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0016"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "TH reads optional attribute(LifetimeEnergyConsumed) attribute in AttributeList from the DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "TH reads optional attribute(ControlMode) attribute in AttributeList from the DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0021"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "TH reads the AcceptedCommandList attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "TH reads the GeneratedCommandList attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_PCC_2_1Suite : public TestCommand
{
public:
    Test_TC_PCC_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_PCC_2_1", 24, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_PCC_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -32768));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -32768));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -32768));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -32768));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -32768));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -32768));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -32768));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::PumpConfigurationAndControl::PumpStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap16", "bitmap16"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 8U));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::PumpConfigurationAndControl::PumpOperationMode value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::PumpConfigurationAndControl::PumpControlMode value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 7U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -32768));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int24u", "int24u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 16777215UL));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int24u", "int24u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 16777215UL));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::PumpConfigurationAndControl::PumpOperationMode value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::PumpConfigurationAndControl::PumpControlMode value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 7U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read the mandatory attribute: MaxPressure");
            VerifyOrDo(!ShouldSkip("PCC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::MaxPressure::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the mandatory attribute: MaxSpeed");
            VerifyOrDo(!ShouldSkip("PCC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::MaxSpeed::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the mandatory attribute: MaxFlow");
            VerifyOrDo(!ShouldSkip("PCC.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::MaxFlow::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the optional attribute: MinConstPressure");
            VerifyOrDo(!ShouldSkip("PCC.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::MinConstPressure::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the optional attribute: MaxConstPressure");
            VerifyOrDo(!ShouldSkip("PCC.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::MaxConstPressure::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read the optional attribute: MinCompPressure");
            VerifyOrDo(!ShouldSkip("PCC.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::MinCompPressure::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read the optional attribute: MaxCompPressure");
            VerifyOrDo(!ShouldSkip("PCC.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::MaxCompPressure::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read the optional attribute: MinConstSpeed");
            VerifyOrDo(!ShouldSkip("PCC.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::MinConstSpeed::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Read the optional attribute: MaxConstSpeed");
            VerifyOrDo(!ShouldSkip("PCC.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::MaxConstSpeed::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Read the optional attribute: MinConstFlow");
            VerifyOrDo(!ShouldSkip("PCC.S.A0009"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::MinConstFlow::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Read the optional attribute: MaxConstFlow");
            VerifyOrDo(!ShouldSkip("PCC.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::MaxConstFlow::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Read the optional attribute: MinConstTemp");
            VerifyOrDo(!ShouldSkip("PCC.S.A000b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::MinConstTemp::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Read the optional attribute: MaxConstTemp");
            VerifyOrDo(!ShouldSkip("PCC.S.A000c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::MaxConstTemp::Id, true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Read the optional attribute: PumpStatus");
            VerifyOrDo(!ShouldSkip("PCC.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::PumpStatus::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Read attribute: EffectiveOperationMode");
            VerifyOrDo(!ShouldSkip("PCC.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::EffectiveOperationMode::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Read attribute: EffectiveControlMode");
            VerifyOrDo(!ShouldSkip("PCC.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::EffectiveControlMode::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Read attribute: Capacity");
            VerifyOrDo(!ShouldSkip("PCC.S.A0013"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::Capacity::Id, true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Read the optional attribute: Speed");
            VerifyOrDo(!ShouldSkip("PCC.S.A0014"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::Speed::Id, true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Read the optional attribute: LifetimeRunningHours");
            VerifyOrDo(!ShouldSkip("PCC.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::LifetimeRunningHours::Id, true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Read the optional attribute: Power");
            VerifyOrDo(!ShouldSkip("PCC.S.A0016"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::Power::Id, true, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "Read the optional attribute: LifetimeEnergyConsumed");
            VerifyOrDo(!ShouldSkip("PCC.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::LifetimeEnergyConsumed::Id, true, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Read optional attribute: OperationMode");
            VerifyOrDo(!ShouldSkip("PCC.S.A0020"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::OperationMode::Id, true, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "Read optional attribute: ControlMode");
            VerifyOrDo(!ShouldSkip("PCC.S.A0021"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::ControlMode::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_PCC_2_2Suite : public TestCommand
{
public:
    Test_TC_PCC_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_PCC_2_2", 9, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_PCC_2_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::PumpConfigurationAndControl::PumpOperationMode value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("effectiveOperationMode", value, 0U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::PumpConfigurationAndControl::PumpOperationMode value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("effectiveOperationMode", value, 1U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::PumpConfigurationAndControl::PumpOperationMode value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("effectiveOperationMode", value, 2U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::PumpConfigurationAndControl::PumpOperationMode value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("effectiveOperationMode", value, 3U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH write 0 (Normal) to the OperationMode attribute to DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0020"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::PumpConfigurationAndControl::PumpOperationMode value;
            value = static_cast<chip::app::Clusters::PumpConfigurationAndControl::PumpOperationMode>(0);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                  PumpConfigurationAndControl::Attributes::OperationMode::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads from the DUT the EffectiveOperationMode attribute");
            VerifyOrDo(!ShouldSkip("PCC.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::EffectiveOperationMode::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH write 1 (Minimum) to the OperationMode attribute to DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0020 && PCC.M.ControlModeConstSpeed"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::PumpConfigurationAndControl::PumpOperationMode value;
            value = static_cast<chip::app::Clusters::PumpConfigurationAndControl::PumpOperationMode>(1);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                  PumpConfigurationAndControl::Attributes::OperationMode::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads from the DUT the EffectiveOperationMode attribute");
            VerifyOrDo(!ShouldSkip("PCC.S.A0011 && PCC.M.ControlModeConstSpeed"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::EffectiveOperationMode::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH write 2 (Maximum) to the OperationMode attribute to DUT one at a time.");
            VerifyOrDo(!ShouldSkip("PCC.S.A0020 && PCC.M.ControlModeConstSpeed"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::PumpConfigurationAndControl::PumpOperationMode value;
            value = static_cast<chip::app::Clusters::PumpConfigurationAndControl::PumpOperationMode>(2);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                  PumpConfigurationAndControl::Attributes::OperationMode::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH reads from the DUT the EffectiveOperationMode attribute");
            VerifyOrDo(!ShouldSkip("PCC.S.A0011 && PCC.M.ControlModeConstSpeed"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::EffectiveOperationMode::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH write 3 (Local) to the OperationMode attribute to DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0020"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::PumpConfigurationAndControl::PumpOperationMode value;
            value = static_cast<chip::app::Clusters::PumpConfigurationAndControl::PumpOperationMode>(3);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                  PumpConfigurationAndControl::Attributes::OperationMode::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH reads from the DUT the EffectiveOperationMode attribute");
            VerifyOrDo(!ShouldSkip("PCC.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::EffectiveOperationMode::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_PCC_2_3Suite : public TestCommand
{
public:
    Test_TC_PCC_2_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_PCC_2_3", 15, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_PCC_2_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::PumpConfigurationAndControl::PumpOperationMode value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("effectiveOperationMode", value, 0U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::PumpConfigurationAndControl::PumpControlMode value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("effectiveControlMode", value, 0U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::PumpConfigurationAndControl::PumpControlMode value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("effectiveControlMode", value, 1U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::PumpConfigurationAndControl::PumpControlMode value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("effectiveControlMode", value, 2U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::PumpConfigurationAndControl::PumpControlMode value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("effectiveControlMode", value, 3U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::PumpConfigurationAndControl::PumpControlMode value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("effectiveControlMode", value, 5U));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::PumpConfigurationAndControl::PumpControlMode value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("effectiveControlMode", value, 7U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Write 0 to the OperationMode attribute to DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0020"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::PumpConfigurationAndControl::PumpOperationMode value;
            value = static_cast<chip::app::Clusters::PumpConfigurationAndControl::PumpOperationMode>(0);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                  PumpConfigurationAndControl::Attributes::OperationMode::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Reads the attribute: EffectiveOperationMode");
            VerifyOrDo(!ShouldSkip("PCC.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::EffectiveOperationMode::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Write 0 to the ControlMode attribute to DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0021 && PCC.M.ControlModeConstSpeed"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::PumpConfigurationAndControl::PumpControlMode value;
            value = static_cast<chip::app::Clusters::PumpConfigurationAndControl::PumpControlMode>(0);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                  PumpConfigurationAndControl::Attributes::ControlMode::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Reads the attribute: EffectiveControlMode");
            VerifyOrDo(!ShouldSkip("PCC.S.A0012 && PCC.M.ControlModeConstSpeed"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::EffectiveControlMode::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Write 1 to the ControlMode attribute to DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0021 && PCC.M.ControlModeConstPressure"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::PumpConfigurationAndControl::PumpControlMode value;
            value = static_cast<chip::app::Clusters::PumpConfigurationAndControl::PumpControlMode>(1);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                  PumpConfigurationAndControl::Attributes::ControlMode::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Reads the attribute: EffectiveControlMode");
            VerifyOrDo(!ShouldSkip("PCC.S.A0012 && PCC.M.ControlModeConstPressure"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::EffectiveControlMode::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Write 2 to the ControlMode attribute to DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0021 && PCC.M.ControlModeCompPressure"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::PumpConfigurationAndControl::PumpControlMode value;
            value = static_cast<chip::app::Clusters::PumpConfigurationAndControl::PumpControlMode>(2);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                  PumpConfigurationAndControl::Attributes::ControlMode::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Reads the attribute: EffectiveControlMode");
            VerifyOrDo(!ShouldSkip("PCC.S.A0012 && PCC.M.ControlModeCompPressure"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::EffectiveControlMode::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Write 3 to the ControlMode attribute to DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0021 && PCC.M.ControlModeConstFlow"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::PumpConfigurationAndControl::PumpControlMode value;
            value = static_cast<chip::app::Clusters::PumpConfigurationAndControl::PumpControlMode>(3);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                  PumpConfigurationAndControl::Attributes::ControlMode::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Reads the attribute: EffectiveControlMode");
            VerifyOrDo(!ShouldSkip("PCC.S.A0012 && PCC.M.ControlModeConstFlow"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::EffectiveControlMode::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Write 5 to the ControlMode attribute to DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0021 && PCC.M.ControlModeConstTemp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::PumpConfigurationAndControl::PumpControlMode value;
            value = static_cast<chip::app::Clusters::PumpConfigurationAndControl::PumpControlMode>(5);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                  PumpConfigurationAndControl::Attributes::ControlMode::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Reads the attribute: EffectiveControlMode");
            VerifyOrDo(!ShouldSkip("PCC.S.A0012 && PCC.M.ControlModeConstTemp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::EffectiveControlMode::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Write 7 to the ControlMode attribute to DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0021 && PCC.M.ControlModeAuto"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::PumpConfigurationAndControl::PumpControlMode value;
            value = static_cast<chip::app::Clusters::PumpConfigurationAndControl::PumpControlMode>(7);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                  PumpConfigurationAndControl::Attributes::ControlMode::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Reads the attribute: EffectiveControlMode");
            VerifyOrDo(!ShouldSkip("PCC.S.A0012 && PCC.M.ControlModeAuto"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::EffectiveControlMode::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_PCC_2_4Suite : public TestCommand
{
public:
    Test_TC_PCC_2_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_PCC_2_4", 13, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_PCC_2_4Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("lifetimeRunningHours", value));
                VerifyOrReturn(CheckValue("lifetimeRunningHours.Value()", value.Value(), 1UL));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("lifetimeRunningHours", value));
                VerifyOrReturn(CheckValue("lifetimeRunningHours.Value()", value.Value(), 2UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("lifetimeRunningHours", value));
                VerifyOrReturn(CheckValue("lifetimeRunningHours.Value()", value.Value(), 3UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("lifetimeEnergyConsumed", value));
                VerifyOrReturn(CheckValue("lifetimeEnergyConsumed.Value()", value.Value(), 1UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("lifetimeEnergyConsumed", value));
                VerifyOrReturn(CheckValue("lifetimeEnergyConsumed.Value()", value.Value(), 2UL));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("lifetimeEnergyConsumed", value));
                VerifyOrReturn(CheckValue("lifetimeEnergyConsumed.Value()", value.Value(), 3UL));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Write 1 to the LifetimeRunningHours attribute to DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint32_t> value;
            value.SetNonNull();
            value.Value() = 1UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                  PumpConfigurationAndControl::Attributes::LifetimeRunningHours::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Reads the attribute: LifetimeRunningHours");
            VerifyOrDo(!ShouldSkip("PCC.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::LifetimeRunningHours::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Write 2 to the LifetimeRunningHours attribute to DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint32_t> value;
            value.SetNonNull();
            value.Value() = 2UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                  PumpConfigurationAndControl::Attributes::LifetimeRunningHours::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Reads the attribute: LifetimeRunningHours");
            VerifyOrDo(!ShouldSkip("PCC.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::LifetimeRunningHours::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Write 3 to the LifetimeRunningHours attribute to DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint32_t> value;
            value.SetNonNull();
            value.Value() = 3UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                  PumpConfigurationAndControl::Attributes::LifetimeRunningHours::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Reads the attribute: LifetimeRunningHours");
            VerifyOrDo(!ShouldSkip("PCC.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::LifetimeRunningHours::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Write 1 to the LifetimeEnergyConsumed attribute to DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint32_t> value;
            value.SetNonNull();
            value.Value() = 1UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                  PumpConfigurationAndControl::Attributes::LifetimeEnergyConsumed::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Reads the attribute: LifetimeEnergyConsumed");
            VerifyOrDo(!ShouldSkip("PCC.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::LifetimeEnergyConsumed::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Write 2 to the LifetimeEnergyConsumed attribute to DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint32_t> value;
            value.SetNonNull();
            value.Value() = 2UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                  PumpConfigurationAndControl::Attributes::LifetimeEnergyConsumed::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Reads the attribute: LifetimeEnergyConsumed");
            VerifyOrDo(!ShouldSkip("PCC.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::LifetimeEnergyConsumed::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Write 3 to the LifetimeEnergyConsumed attribute to DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint32_t> value;
            value.SetNonNull();
            value.Value() = 3UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                  PumpConfigurationAndControl::Attributes::LifetimeEnergyConsumed::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Reads the attribute: LifetimeEnergyConsumed");
            VerifyOrDo(!ShouldSkip("PCC.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::LifetimeEnergyConsumed::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_PSCFG_1_1Suite : public TestCommand
{
public:
    Test_TC_PSCFG_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_PSCFG_1_1", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_PSCFG_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Commission DUT to TH");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH reads the ClusterRevision attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), PowerSourceConfiguration::Id,
                                 PowerSourceConfiguration::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads the FeatureMap attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), PowerSourceConfiguration::Id,
                                 PowerSourceConfiguration::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH reads the AttributeList attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), PowerSourceConfiguration::Id,
                                 PowerSourceConfiguration::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads the AcceptedCommandList attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), PowerSourceConfiguration::Id,
                                 PowerSourceConfiguration::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads the GeneratedCommandList attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), PowerSourceConfiguration::Id,
                                 PowerSourceConfiguration::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_PSCFG_2_1Suite : public TestCommand
{
public:
    Test_TC_PSCFG_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_PSCFG_2_1", 2, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_PSCFG_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Commission DUT to TH");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH reads the Sources attribute from the DUT");
            VerifyOrDo(!ShouldSkip("PSCFG.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), PowerSourceConfiguration::Id,
                                 PowerSourceConfiguration::Attributes::Sources::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_RH_1_1Suite : public TestCommand
{
public:
    Test_TC_RH_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_RH_1_1", 7, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_RH_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 3U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read ClusterRevision attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), RelativeHumidityMeasurement::Id,
                                 RelativeHumidityMeasurement::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read FeatureMap attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), RelativeHumidityMeasurement::Id,
                                 RelativeHumidityMeasurement::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), RelativeHumidityMeasurement::Id,
                                 RelativeHumidityMeasurement::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the optional attribute(Tolerance) in AttributeList");
            VerifyOrDo(!ShouldSkip("RH.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), RelativeHumidityMeasurement::Id,
                                 RelativeHumidityMeasurement::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), RelativeHumidityMeasurement::Id,
                                 RelativeHumidityMeasurement::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), RelativeHumidityMeasurement::Id,
                                 RelativeHumidityMeasurement::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_RH_2_1Suite : public TestCommand
{
public:
    Test_TC_RH_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_RH_2_1", 5, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_RH_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9999U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 10000U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 10000U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2048U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH reads the MinMeasuredValue attribute from the DUT");
            VerifyOrDo(!ShouldSkip("RH.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), RelativeHumidityMeasurement::Id,
                                 RelativeHumidityMeasurement::Attributes::MinMeasuredValue::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads the MaxMeasuredValue attribute from the DUT");
            VerifyOrDo(!ShouldSkip("RH.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), RelativeHumidityMeasurement::Id,
                                 RelativeHumidityMeasurement::Attributes::MaxMeasuredValue::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH reads the MeasuredValue attribute from the DUT");
            VerifyOrDo(!ShouldSkip("RH.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), RelativeHumidityMeasurement::Id,
                                 RelativeHumidityMeasurement::Attributes::MeasuredValue::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads the Tolerance attribute from the DUT");
            VerifyOrDo(!ShouldSkip("RH.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), RelativeHumidityMeasurement::Id,
                                 RelativeHumidityMeasurement::Attributes::Tolerance::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SWTCH_1_1Suite : public TestCommand
{
public:
    Test_TC_SWTCH_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SWTCH_1_1", 12, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SWTCH_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 2UL));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 4UL));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 8UL));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 16UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 2UL));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 1UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 2UL));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 4UL));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 1UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 2UL));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 4UL));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 8UL));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 1UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 2UL));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 4UL));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 16UL));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 1UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Switch::Id, Switch::Attributes::ClusterRevision::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read FeatureMap  attribute and Check values of flags in this FeatureMap");
            VerifyOrDo(!ShouldSkip("!SWTCH.S.F00 && !SWTCH.S.F01 && !SWTCH.S.F02 && !SWTCH.S.F03 && !SWTCH.S.F04"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Switch::Id, Switch::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Given SWTCH.S.F00(LS) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("SWTCH.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Switch::Id, Switch::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Given SWTCH.S.F01(MS) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("SWTCH.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Switch::Id, Switch::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Given SWTCH.S.F02(MSR) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("SWTCH.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Switch::Id, Switch::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Given SWTCH.S.F03(MSL) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("SWTCH.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Switch::Id, Switch::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Given SWTCH.S.F04(MSM) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("SWTCH.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Switch::Id, Switch::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read the global attribute: AttributeList");
            VerifyOrDo(!ShouldSkip("SWTCH.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Switch::Id, Switch::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Read the global attribute: AttributeList");
            VerifyOrDo(!ShouldSkip("!SWTCH.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Switch::Id, Switch::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Switch::Id, Switch::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Switch::Id, Switch::Attributes::GeneratedCommandList::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SWTCH_2_1Suite : public TestCommand
{
public:
    Test_TC_SWTCH_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SWTCH_2_1", 4, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SWTCH_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    uint8_t NumberOfPositionsValue;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 2U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
                NumberOfPositionsValue = value;
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, NumberOfPositionsValue - 1));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 2U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read NumberOfPositions attribute");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Switch::Id, Switch::Attributes::NumberOfPositions::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read CurrentPosition attribute");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Switch::Id, Switch::Attributes::CurrentPosition::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read MultiPressMax attribute");
            VerifyOrDo(!ShouldSkip("SWTCH.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Switch::Id, Switch::Attributes::MultiPressMax::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_TMP_1_1Suite : public TestCommand
{
public:
    Test_TC_TMP_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_TMP_1_1", 7, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_TMP_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 4U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read ClusterRevision attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TemperatureMeasurement::Id,
                                 TemperatureMeasurement::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read FeatureMap attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TemperatureMeasurement::Id,
                                 TemperatureMeasurement::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TemperatureMeasurement::Id,
                                 TemperatureMeasurement::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the optional attribute(Tolerance) in AttributeList");
            VerifyOrDo(!ShouldSkip("TMP.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TemperatureMeasurement::Id,
                                 TemperatureMeasurement::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read AcceptedCommandList attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TemperatureMeasurement::Id,
                                 TemperatureMeasurement::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read GeneratedCommandList attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TemperatureMeasurement::Id,
                                 TemperatureMeasurement::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_TMP_2_1Suite : public TestCommand
{
public:
    Test_TC_TMP_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_TMP_2_1", 5, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_TMP_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -27315));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -27314));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -27315));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2048U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read the mandatory attribute: MinMeasuredValue");
            VerifyOrDo(!ShouldSkip("TMP.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TemperatureMeasurement::Id,
                                 TemperatureMeasurement::Attributes::MinMeasuredValue::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the mandatory attribute: MaxMeasuredValue");
            VerifyOrDo(!ShouldSkip("TMP.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TemperatureMeasurement::Id,
                                 TemperatureMeasurement::Attributes::MaxMeasuredValue::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the mandatory attribute: MeasuredValue");
            VerifyOrDo(!ShouldSkip("TMP.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TemperatureMeasurement::Id,
                                 TemperatureMeasurement::Attributes::MeasuredValue::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the optional attribute: Tolerance");
            VerifyOrDo(!ShouldSkip("TMP.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TemperatureMeasurement::Id,
                                 TemperatureMeasurement::Attributes::Tolerance::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_TSTAT_1_1Suite : public TestCommand
{
public:
    Test_TC_TSTAT_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_TSTAT_1_1", 22, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_TSTAT_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 5U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 2UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 4UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 8UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 16UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 32UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 27UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 28UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 18UL));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 17UL));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 20UL));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 19UL));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 17UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 18UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 25UL));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 32UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 33UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 34UL));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 52UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 53UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 54UL));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 55UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 56UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 57UL));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::ClusterRevision::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            VerifyOrDo(!ShouldSkip("!TSTAT.S.F00 && !TSTAT.S.F01 && !TSTAT.S.F02 && !TSTAT.S.F03 && !TSTAT.S.F04 && !TSTAT.S.F05"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Given TSTAT.S.F00(HEAT ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Given TSTAT.S.F01(COOL) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Given TSTAT.S.F02(OCC) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Given TSTAT.S.F03(SCH) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Given TSTAT.S.F04(SB) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Given TSTAT.S.F05(AUTO) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F05"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Read the Feature dependent(TSTAT.S.F00(HEAT)) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Read the Feature dependent(TSTAT.S.F01(COOL)) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Read the Feature dependent(TSTAT.S.F02(OCC)) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Read the Feature dependent(TSTAT.S.F00(HEAT) & TSTAT.S.F02(OCC)) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && TSTAT.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Read the Feature dependent(TSTAT.S.F01(COOL) & TSTAT.S.F02(OCC)) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Read the Feature dependent(TSTAT.S.F05(AUTO)) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F05"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Read the Feature dependent(TSTAT.S.F03(SCH)) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Read the Feature dependent(TSTAT.S.F04(SB)) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Read the Feature dependent(TSTAT.S.F04(SB) & TSTAT.S.F02(OCC)) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F04 && TSTAT.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::AcceptedCommandList::Id,
                                 true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Read Feature dependent(TSTAT.S.F03(SCH)) commands in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::AcceptedCommandList::Id,
                                 true, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::GeneratedCommandList::Id,
                                 true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_TSTAT_2_1Suite : public TestCommand
{
public:
    Test_TC_TSTAT_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_TSTAT_2_1", 68, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_TSTAT_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    int16_t AbsMinCoolSetpointLimitStep5;
    int8_t MinSetpointDeadBand;
    int16_t AbsMaxCoolSetpointLimitStep6;
    int16_t MinCoolSetpointLimit;
    int16_t MaxCoolSetpointLimit;
    int16_t OccupiedCoolingSetpoint;
    int16_t AbsMinHeat;
    int16_t AbsMaxHeat;
    int16_t UnoccupiedCoolingSetpoint;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                AbsMinCoolSetpointLimitStep5 = value;
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                MinSetpointDeadBand = value;
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                AbsMaxCoolSetpointLimitStep6 = value;
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                MinCoolSetpointLimit = value;
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                MaxCoolSetpointLimit = value;
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                OccupiedCoolingSetpoint = value;
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                AbsMinHeat = value;
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                AbsMaxHeat = value;
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                UnoccupiedCoolingSetpoint = value;
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -27315));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -27315));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 1U));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, AbsMinCoolSetpointLimitStep5 - MinSetpointDeadBand));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 1575));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -27315));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -27315));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -27315));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -27315));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 100U));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 100U));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 63U));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8s", "int8s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -25));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 25));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, MinCoolSetpointLimit));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, MaxCoolSetpointLimit));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1600));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3200));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, AbsMinCoolSetpointLimitStep5));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, OccupiedCoolingSetpoint - MinSetpointDeadBand));
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 700));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3000));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, AbsMinHeat));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, AbsMaxHeat));
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1600));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3200));
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 700));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, UnoccupiedCoolingSetpoint - MinSetpointDeadBand));
            }
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 700));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3000));
            }
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 700));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, MinCoolSetpointLimit - MinSetpointDeadBand));
            }
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 700));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3000));
            }
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 700));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3000));
            }
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 700));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, MaxCoolSetpointLimit - MinSetpointDeadBand));
            }
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, AbsMinCoolSetpointLimitStep5));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, MaxCoolSetpointLimit));
            }
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1600));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3200));
            }
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, MinCoolSetpointLimit));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, AbsMaxCoolSetpointLimitStep6));
            }
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8s", "int8s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 25));
            }
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 7U));
            }
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Thermostat::ThermostatControlSequence value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 5U));
            }
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9U));
            }
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9U));
            }
            break;
        case 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 6U));
            }
            break;
        case 44:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 45:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 1U));
            }
            break;
        case 47:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 1440U));
            }
            break;
        case 48:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 7U));
            }
            break;
        case 49:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap16", "bitmap16"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 127U));
            }
            break;
        case 50:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            break;
        case 51:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -27315));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 52:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "utc", "utc"));
            }
            break;
        case 53:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 54:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 55:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 56:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 57:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 58:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 59:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 60:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4U));
            }
            break;
        case 61:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 62:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 63:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 64:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 65:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 5U));
            }
            break;
        case 66:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -27315));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 67:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("ACCapacityformat", value, 0U));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Saving value for comparision in step 5 read AbsMinCoolSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::AbsMinCoolSetpointLimit::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Saving value for comparision in step 5 read attribute MinSetpointDeadBand attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0019"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinSetpointDeadBand::Id,
                                 true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Saving value for comparision in step 6 read AbsMaxCoolSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::AbsMaxCoolSetpointLimit::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Saving value for comparision in step 17 read MinCoolSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinCoolSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Saving value for comparision in step 17 read MaxCoolSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0018"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxCoolSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Saving value for comparision in step 13 read attribute OccupiedCoolingSetpoint");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::OccupiedCoolingSetpoint::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Saving value for comparision in step 15 read attribute AbsMinHeatSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::AbsMinHeatSetpointLimit::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Saving value for comparision in step 15 read attribute AbsMaxHeatSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::AbsMaxHeatSetpointLimit::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Saving value for comparision in step 16 read UnoccupiedCoolingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0013"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::UnoccupiedCoolingSetpoint::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Reads mandatory attributes from DUT: LocalTemperature");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::LocalTemperature::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Read OutdoorTemperature attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::OutdoorTemperature::Id,
                                 true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Read Occupancy attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::Occupancy::Id, true,
                                 chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Read attribute AbsMinHeatSetpointLimit if TSTAT.S.F05 feature is supported");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0003 && TSTAT.S.A0005 && TSTAT.S.F05"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::AbsMinHeatSetpointLimit::Id, true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Read attribute AbsMinHeatSetpointLimit if TSTAT.S.F05 feature is supported");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0003 && !TSTAT.S.A0005 && TSTAT.S.F05"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::AbsMinHeatSetpointLimit::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Read attribute AbsMinHeatSetpointLimit from DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0003 && !TSTAT.S.F05"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::AbsMinHeatSetpointLimit::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Reads mandatory attributes from DUT: AbsMaxHeatSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::AbsMaxHeatSetpointLimit::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Read attribute AbsMinCoolSetpointLimit from DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::AbsMinCoolSetpointLimit::Id, true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Read attribute AbsMaxCoolSetpointLimit from DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::AbsMaxCoolSetpointLimit::Id, true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Read PICoolingDemand attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::PICoolingDemand::Id, true,
                                 chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Read PIHeatingDemand attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::PIHeatingDemand::Id, true,
                                 chip::NullOptional);
        }
        case 21: {
            LogStep(21, "Read HVACSystemTypeConfiguration attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0009"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::HVACSystemTypeConfiguration::Id, true, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Read LocalTemperatureCalibration attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::LocalTemperatureCalibration::Id, true, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "Read attribute OccupiedCoolingSetpoint from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017 && TSTAT.S.A0018"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::OccupiedCoolingSetpoint::Id, true, chip::NullOptional);
        }
        case 24: {
            LogStep(24, "Read attribute OccupiedCoolingSetpoint from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && !TSTAT.S.A0017 && !TSTAT.S.A0018"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::OccupiedCoolingSetpoint::Id, true, chip::NullOptional);
        }
        case 25: {
            LogStep(25, "Read attribute OccupiedHeatingSetpoint if TSTAT.S.F05 feature is supported");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F05 && TSTAT.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::OccupiedHeatingSetpoint::Id, true, chip::NullOptional);
        }
        case 26: {
            LogStep(26, "Read attribute OccupiedHeatingSetpoint from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && !TSTAT.S.F05"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::OccupiedHeatingSetpoint::Id, true, chip::NullOptional);
        }
        case 27: {
            LogStep(27, "Read UnoccupiedCoolingSetpoint attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F05 && TSTAT.S.A0013"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::UnoccupiedCoolingSetpoint::Id, true, chip::NullOptional);
        }
        case 28: {
            LogStep(28, "Read UnoccupiedCoolingSetpoint attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.F02 && !TSTAT.S.F05"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::UnoccupiedCoolingSetpoint::Id, true, chip::NullOptional);
        }
        case 29: {
            LogStep(29, "Read UnoccupiedHeatingSetpoint attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && TSTAT.S.F02 && TSTAT.S.F05 && TSTAT.S.A0013"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::UnoccupiedHeatingSetpoint::Id, true, chip::NullOptional);
        }
        case 30: {
            LogStep(30, "Read UnoccupiedHeatingSetpoint attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && TSTAT.S.F02 && !TSTAT.S.F05"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::UnoccupiedHeatingSetpoint::Id, true, chip::NullOptional);
        }
        case 31: {
            LogStep(31, "Reads attribute from DUT: MinHeatSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0015 && TSTAT.S.F05 && TSTAT.S.A0017"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinHeatSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 32: {
            LogStep(32, "Read attribute MinHeatSetpointLimit from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0015 && !TSTAT.S.F05"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinHeatSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 33: {
            LogStep(33, "Read attribute MaxHeatSetpointLimit from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0016 && !TSTAT.S.F05"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxHeatSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 34: {
            LogStep(34, "Reads attribute from DUT: MaxHeatSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0016 && TSTAT.S.F05 && TSTAT.S.A0018"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxHeatSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 35: {
            LogStep(35, "Read attribute MinCoolSetpointLimit from DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0017 && TSTAT.S.A0018 && TSTAT.S.A0005"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinCoolSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 36: {
            LogStep(36, "Read attribute MinCoolSetpointLimit from DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0017 && !TSTAT.S.A0018 && !TSTAT.S.A0005"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinCoolSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 37: {
            LogStep(37, "Read attribute MaxCoolSetpointLimit from DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0018 && TSTAT.S.A0006 && TSTAT.S.A0017"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxCoolSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 38: {
            LogStep(38, "Read attribute MinSetpointDeadBand from DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F05"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinSetpointDeadBand::Id,
                                 true, chip::NullOptional);
        }
        case 39: {
            LogStep(39, "Read RemoteSensing attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A001a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::RemoteSensing::Id, true,
                                 chip::NullOptional);
        }
        case 40: {
            LogStep(40, "Read attribute ControlSequenceOfOperation from DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A001b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::ControlSequenceOfOperation::Id, true, chip::NullOptional);
        }
        case 41: {
            LogStep(41, "Read attribute SystemMode from DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A001c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::SystemMode::Id, true,
                                 chip::NullOptional);
        }
        case 42: {
            LogStep(42, "Read ThermostatRunningMode attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A001e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::ThermostatRunningMode::Id,
                                 true, chip::NullOptional);
        }
        case 43: {
            LogStep(43, "Reads constraints of optional attributes from DUT: StartOfWeek");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::StartOfWeek::Id, true,
                                 chip::NullOptional);
        }
        case 44: {
            LogStep(44, "Reads optional attributes from DUT: NumberOfWeeklyTransitions");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::NumberOfWeeklyTransitions::Id, true, chip::NullOptional);
        }
        case 45: {
            LogStep(45, "Reads optional attributes from DUT: NumberOfDailyTransitions");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::NumberOfDailyTransitions::Id, true, chip::NullOptional);
        }
        case 46: {
            LogStep(46, "Read TemperatureSetpointHold attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0023"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::TemperatureSetpointHold::Id, true, chip::NullOptional);
        }
        case 47: {
            LogStep(47, "Read TemperatureSetpointHoldDuration attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0024"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::TemperatureSetpointHoldDuration::Id, true, chip::NullOptional);
        }
        case 48: {
            LogStep(48, "Read ThermostatProgrammingOperationMode attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0025"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::ThermostatProgrammingOperationMode::Id, true, chip::NullOptional);
        }
        case 49: {
            LogStep(49, "Read ThermostatRunningState attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0029"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::ThermostatRunningState::Id,
                                 true, chip::NullOptional);
        }
        case 50: {
            LogStep(50, "Read SetpointChangeSource attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0030"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::SetpointChangeSource::Id,
                                 true, chip::NullOptional);
        }
        case 51: {
            LogStep(51, "Read SetpointChangeAmount attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0031"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::SetpointChangeAmount::Id,
                                 true, chip::NullOptional);
        }
        case 52: {
            LogStep(52, "Read SetpointChangeSourceTimestamp attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0032"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::SetpointChangeSourceTimestamp::Id, true, chip::NullOptional);
        }
        case 53: {
            LogStep(53, "Read OccupiedSetback attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::OccupiedSetback::Id, true,
                                 chip::NullOptional);
        }
        case 54: {
            LogStep(54, "Read OccupiedSetbackMin attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::OccupiedSetbackMin::Id,
                                 true, chip::NullOptional);
        }
        case 55: {
            LogStep(55, "Read OccupiedSetbackMax attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::OccupiedSetbackMax::Id,
                                 true, chip::NullOptional);
        }
        case 56: {
            LogStep(56, "Read UnoccupiedSetback attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::UnoccupiedSetback::Id,
                                 true, chip::NullOptional);
        }
        case 57: {
            LogStep(57, "Read UnoccupiedSetbackMin attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::UnoccupiedSetbackMin::Id,
                                 true, chip::NullOptional);
        }
        case 58: {
            LogStep(58, "Read UnoccupiedSetbackMax attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::UnoccupiedSetbackMax::Id,
                                 true, chip::NullOptional);
        }
        case 59: {
            LogStep(59, "Read EmergencyHeatDelta attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A003a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::EmergencyHeatDelta::Id,
                                 true, chip::NullOptional);
        }
        case 60: {
            LogStep(60, "Read ACType attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0040"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::ACType::Id, true,
                                 chip::NullOptional);
        }
        case 61: {
            LogStep(61, "Read ACCapacity attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0041"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::ACCapacity::Id, true,
                                 chip::NullOptional);
        }
        case 62: {
            LogStep(62, "Read ACRefrigerantType attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0042"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::ACRefrigerantType::Id,
                                 true, chip::NullOptional);
        }
        case 63: {
            LogStep(63, "Read ACCompressorType attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0043"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::ACCompressorType::Id, true,
                                 chip::NullOptional);
        }
        case 64: {
            LogStep(64, "Read ACErrorCode attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0044"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::ACErrorCode::Id, true,
                                 chip::NullOptional);
        }
        case 65: {
            LogStep(65, "Read ACLouverPosition attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0045"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::ACLouverPosition::Id, true,
                                 chip::NullOptional);
        }
        case 66: {
            LogStep(66, "Read ACCoilTemperature attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0046"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::ACCoilTemperature::Id,
                                 true, chip::NullOptional);
        }
        case 67: {
            LogStep(67, "Read ACCapacityFormat attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0047"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::ACCapacityformat::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_TSTAT_2_2Suite : public TestCommand
{
public:
    Test_TC_TSTAT_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_TSTAT_2_2", 162, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_TSTAT_2_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    int16_t MinCoolSetpointLimit;
    int16_t MaxCoolSetpointLimit;
    int8_t MinSetpointDeadBand;
    int16_t MinHeatSetpointLimit;
    int16_t UnoccupiedCoolingSetpoint;
    int16_t MaxHeatSetpointLimit;
    int16_t OccupiedHeatingSetpoint;
    int16_t OccupiedCoolingSetpoint;
    int16_t AbsMinHeatSetpointLimitValue;
    int16_t AbsMaxHeatSetpointLimitValue;
    int16_t AbsMinCoolSetpointLimit;
    int16_t AbsMaxCoolSetpointLimit;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                MinCoolSetpointLimit = value;
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                MaxCoolSetpointLimit = value;
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                MinSetpointDeadBand = value;
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                MinHeatSetpointLimit = value;
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                UnoccupiedCoolingSetpoint = value;
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                MaxHeatSetpointLimit = value;
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                OccupiedHeatingSetpoint = value;
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                OccupiedCoolingSetpoint = value;
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                AbsMinHeatSetpointLimitValue = value;
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                AbsMaxHeatSetpointLimitValue = value;
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                AbsMinCoolSetpointLimit = value;
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                AbsMaxCoolSetpointLimit = value;
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, MinCoolSetpointLimit));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, MaxCoolSetpointLimit));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1600));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3200));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("occupiedCoolingSetpoint", value, 2500));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, MinHeatSetpointLimit));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, MaxHeatSetpointLimit));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 700));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3000));
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("occupiedHeatingSetpoint", value, 2100));
            }
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, MinCoolSetpointLimit));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, MaxCoolSetpointLimit));
            }
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1600));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3200));
            }
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("unoccupiedCoolingSetpoint", value, 2500));
            }
            break;
        case 44:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 45:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 47:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 48:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 49:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 50:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 51:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 52:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 53:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 54:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, MinHeatSetpointLimit));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, MaxHeatSetpointLimit));
            }
            break;
        case 55:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 700));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3000));
            }
            break;
        case 56:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 57:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("unoccupiedHeatingSetpoint", value, 2500));
            }
            break;
        case 58:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 59:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 60:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 61:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 62:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 63:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 64:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 65:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 66:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 67:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 68:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, AbsMinHeatSetpointLimitValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, MaxHeatSetpointLimit));
            }
            break;
        case 69:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 700));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3000));
            }
            break;
        case 70:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 71:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("minHeatSetpointLimit", value, 800));
            }
            break;
        case 72:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 73:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 74:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 75:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 76:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 77:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 78:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 79:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 80:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 81:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 82:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, MinHeatSetpointLimit));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, AbsMaxHeatSetpointLimitValue));
            }
            break;
        case 83:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 700));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3000));
            }
            break;
        case 84:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 85:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 86:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 87:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("maxHeatSetpointLimit", value, 2900));
            }
            break;
        case 88:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 89:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 90:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 91:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 92:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 93:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 94:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 95:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 96:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 97:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, AbsMinCoolSetpointLimit));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, MaxCoolSetpointLimit));
            }
            break;
        case 98:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1600));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3200));
            }
            break;
        case 99:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 100:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("minCoolSetpointLimit", value, 2000));
            }
            break;
        case 101:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 102:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 103:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 104:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 105:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 106:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 107:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 108:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 109:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 110:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, MinCoolSetpointLimit));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, AbsMaxCoolSetpointLimit));
            }
            break;
        case 111:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1600));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3200));
            }
            break;
        case 112:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 113:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("maxCoolSetpointLimit", value, 2000));
            }
            break;
        case 114:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 115:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 116:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 117:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 118:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 119:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 120:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 121:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 122:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 123:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 124:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 125:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 126:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 127:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 128:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 129:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8s", "int8s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 25));
            }
            break;
        case 130:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 131:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("minSetpointDeadBand", value, 5));
            }
            break;
        case 132:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 133:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 134:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 135:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 136:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Thermostat::ThermostatControlSequence value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("controlSequenceOfOperation", value, 4U));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 5U));
            }
            break;
        case 137:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 138:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Thermostat::ThermostatControlSequence value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("controlSequenceOfOperation", value, 2U));
            }
            break;
        case 139:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 140:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 141:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 142:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 143:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("occupiedHeatingSetpoint", value, 1700));
            }
            break;
        case 144:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 145:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 146:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("occupiedHeatingSetpoint", value, 2300));
            }
            break;
        case 147:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 148:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("occupiedCoolingSetpoint", value, 2300));
            }
            break;
        case 149:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 150:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 151:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("occupiedCoolingSetpoint", value, 2900));
            }
            break;
        case 152:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 153:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 154:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 155:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("occupiedCoolingSetpoint", value, 2300));
            }
            break;
        case 156:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("occupiedHeatingSetpoint", value, 1700));
            }
            break;
        case 157:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 158:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 159:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 160:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("occupiedCoolingSetpoint", value, 2900));
            }
            break;
        case 161:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("occupiedHeatingSetpoint", value, 2300));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Saving value for comparision in step 2a read MinCoolSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinCoolSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Saving value for comparision in step 2a read MaxCoolSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0018"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxCoolSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Saving value for comparision in step 2c read attribute MinSetpointDeadBand");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0019"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinSetpointDeadBand::Id,
                                 true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Saving value for comparision in step 3a read MinHeatSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinHeatSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Saving value for comparision in step 3 reads UnoccupiedCoolingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0013"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::UnoccupiedCoolingSetpoint::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Saving value for comparision in step 3a read MaxHeatSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0016"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxHeatSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Saving value for comparision in step3c read attribute OccupiedHeatingSetpoint");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::OccupiedHeatingSetpoint::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Saving value for comparision in step3c read attribute OccupiedCoolingSetpoint");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::OccupiedCoolingSetpoint::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Saving value for comparision in step 6a read attribute AbsMinHeatSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::AbsMinHeatSetpointLimit::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Saving value for comparision in step 7a read attribute AbsMaxHeatSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::AbsMaxHeatSetpointLimit::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Saving value for comparision in step 8a read attribute AbsMinCoolSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::AbsMinCoolSetpointLimit::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Saving value for comparision in step9a read attribute AbsMaxCoolSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::AbsMaxCoolSetpointLimit::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Read attribute OccupiedCoolingSetpoint from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017 && TSTAT.S.A0018"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::OccupiedCoolingSetpoint::Id, true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Reads OccupiedCoolingSetpoint attribute from Server DUT and verifies that the value is within range");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && !TSTAT.S.A0017 && !TSTAT.S.A0018"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::OccupiedCoolingSetpoint::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Writes a value back that is different but valid for OccupiedCoolingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 2500;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedCoolingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Reads it back again to confirm the successful write of OccupiedCoolingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::OccupiedCoolingSetpoint::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Writes OccupiedCoolingSetpoint to value below the MinCoolSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && !TSTAT.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 30;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedCoolingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Writes OccupiedCoolingSetpoint to value below the MinCoolSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017 && PICS_SKIP_SAMPLE_APP"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' after successgarbage: not in length on purpose", 30);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 19: {
            LogStep(19, "Writes OccupiedCoolingSetpoint to value above the MaxCoolSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && !TSTAT.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 4000;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedCoolingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Writes OccupiedCoolingSetpoint to value above the MaxCoolSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = static_cast<int16_t>(MaxCoolSetpointLimit + 1000);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedCoolingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 21: {
            LogStep(21, "Writes the limit of MinCoolSetpointLimit to OccupiedCoolingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && !TSTAT.S.F05 && !TSTAT.S.A0017"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 1600;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedCoolingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Writes the limit of MinCoolSetpointLimit to OccupiedCoolingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && !TSTAT.S.F05 && TSTAT.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = MinCoolSetpointLimit;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedCoolingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 23: {
            LogStep(23,
                    "Writes If TSTAT.S.F05(AUTO) LowerLimit = Max(MinCoolSetpointLimit, (OccupiedHeatingSetpoint + "
                    "MinSetpointDeadBand)) to OccupiedCoolingSetpoint attribute when Auto is enabled");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F05 && TSTAT.S.A0012 && PICS_SKIP_SAMPLE_APP"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' after successgarbage: not in length on purpose", 30);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 24: {
            LogStep(24, "Writes the limit of MaxCoolSetpointLimit to OccupiedCoolingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && !TSTAT.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 3200;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedCoolingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 25: {
            LogStep(25, "Writes the limit of MaxCoolSetpointLimit to OccupiedCoolingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = MaxCoolSetpointLimit;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedCoolingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 26: {
            LogStep(26, "Reads OccupiedHeatingSetpoint attribute from Server DUT and verifies that the value is within range");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && TSTAT.S.A0015 && TSTAT.S.A0016"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::OccupiedHeatingSetpoint::Id, true, chip::NullOptional);
        }
        case 27: {
            LogStep(27, "Reads OccupiedHeatingSetpoint attribute from Server DUT and verifies that the value is within range");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && !TSTAT.S.A0015 && !TSTAT.S.A0016"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::OccupiedHeatingSetpoint::Id, true, chip::NullOptional);
        }
        case 28: {
            LogStep(28, "Writes a value back that is different but valid for OccupiedHeatingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 2100;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 29: {
            LogStep(29, "Reads it back again to confirm the successful write of OccupiedHeatingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::OccupiedHeatingSetpoint::Id, true, chip::NullOptional);
        }
        case 30: {
            LogStep(30, "Writes OccupiedHeatingSetpoint to value below the MinHeatSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && !TSTAT.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 600;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 31: {
            LogStep(31, "Writes OccupiedHeatingSetpoint to value below the MinHeatSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && TSTAT.S.A0015 && PICS_SKIP_SAMPLE_APP"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' after successgarbage: not in length on purpose", 30);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 32: {
            LogStep(32, "Writes OccupiedHeatingSetpoint to value above the MaxHeatSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && !TSTAT.S.A0016"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 4010;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 33: {
            LogStep(33, "Writes OccupiedHeatingSetpoint to value above the MaxHeatSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && TSTAT.S.A0016"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = static_cast<int16_t>(MaxHeatSetpointLimit + 1000);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 34: {
            LogStep(34, "Writes the limit of MinHeatSetpointLimit to OccupiedHeatingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && !TSTAT.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 700;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 35: {
            LogStep(35, "Writes the limit of MinHeatSetpointLimit to OccupiedHeatingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && TSTAT.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = MinHeatSetpointLimit;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 36: {
            LogStep(36, "Writes the limit of MaxHeatSetpointLimit to OccupiedHeatingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && !TSTAT.S.F05 && !TSTAT.S.A0016"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 3000;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 37: {
            LogStep(37, "Writes the limit of MaxHeatSetpointLimit to OccupiedHeatingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && !TSTAT.S.F05 && TSTAT.S.A0016"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = MaxHeatSetpointLimit;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 38: {
            LogStep(38, "Writes the limit of MaxHeatSetpointLimit to OccupiedHeatingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F05 && !TSTAT.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 3000;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 39: {
            LogStep(39,
                    "Writes If TSTAT.S.F05(AUTO) UpperLimit = Min(MaxHeatSetpointLimit, (OccupiedCoolingSetpoint - "
                    "MinSetpointDeadBand)) to OccupiedHeatingSetpoint attribute when Auto is enabled");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F05 && TSTAT.S.A0011 && TSTAT.S.A0012 && PICS_SKIP_SAMPLE_APP"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' after successgarbage: not in length on purpose", 30);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 40: {
            LogStep(40, "Reads UnoccupiedCoolingSetpoint attribute from Server DUT and verifies that the value is within range");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F01 && TSTAT.S.A0017 && TSTAT.S.A0018"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::UnoccupiedCoolingSetpoint::Id, true, chip::NullOptional);
        }
        case 41: {
            LogStep(41, "Reads UnoccupiedCoolingSetpoint attribute from Server DUT and verifies that the value is within range");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F01 && !TSTAT.S.A0017 && !TSTAT.S.A0018"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::UnoccupiedCoolingSetpoint::Id, true, chip::NullOptional);
        }
        case 42: {
            LogStep(42, "Writes a value back that is different but valid for UnoccupiedCoolingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 2500;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::UnoccupiedCoolingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 43: {
            LogStep(43, "Reads it back again to confirm the successful write of UnoccupiedCoolingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::UnoccupiedCoolingSetpoint::Id, true, chip::NullOptional);
        }
        case 44: {
            LogStep(44, "Writes UnoccupiedCoolingSetpoint to value below the MinCoolSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F01 && !TSTAT.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 1002;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::UnoccupiedCoolingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 45: {
            LogStep(45, "Writes UnoccupiedCoolingSetpoint to value below the MinCoolSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F01 && TSTAT.S.A0017 && PICS_SKIP_SAMPLE_APP"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' after successgarbage: not in length on purpose", 30);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 46: {
            LogStep(46, "Writes UnoccupiedCoolingSetpoint to value above the MaxCoolSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F01 && !TSTAT.S.A0018"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 4010;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::UnoccupiedCoolingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 47: {
            LogStep(47, "Writes UnoccupiedCoolingSetpoint to value above the MaxCoolSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F01 && TSTAT.S.A0018"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = static_cast<int16_t>(MaxCoolSetpointLimit + 1000);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::UnoccupiedCoolingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 48: {
            LogStep(48, "Writes the limit of MinCoolSetpointLimit to UnoccupiedCoolingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F01 && !TSTAT.S.A0017 && !TSTAT.S.F05"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 1600;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::UnoccupiedCoolingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 49: {
            LogStep(49, "Writes the limit of MinCoolSetpointLimit to UnoccupiedCoolingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F01 && !TSTAT.S.A0017 && TSTAT.S.F05"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 1600;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::UnoccupiedCoolingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 50: {
            LogStep(50, "Writes the limit of MinCoolSetpointLimit to UnoccupiedCoolingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F01 && TSTAT.S.A0017 && !TSTAT.S.F05"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = MinCoolSetpointLimit;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::UnoccupiedCoolingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 51: {
            LogStep(51,
                    "Writes If TSTAT.S.F05(AUTO) LowerLimit = Max(MinCoolSetpointLimit, (UnoccupiedCoolingSetpoint + "
                    "MinSetpointDeadBand)) to UnoccupiedCoolingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F01 && TSTAT.S.A0013 && TSTAT.S.F05 && PICS_SKIP_SAMPLE_APP"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' after successgarbage: not in length on purpose", 30);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 52: {
            LogStep(52, "Writes the limit of MaxCoolSetpointLimit to UnoccupiedCoolingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F01 && !TSTAT.S.A0018 && !TSTAT.S.F05"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 3200;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::UnoccupiedCoolingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 53: {
            LogStep(53, "Writes the limit of MaxCoolSetpointLimit to UnoccupiedCoolingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F01 && TSTAT.S.A0018 && !TSTAT.S.F05"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = MaxCoolSetpointLimit;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::UnoccupiedCoolingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 54: {
            LogStep(54, "Reads UnoccupiedHeatingSetpoint attribute from Server DUT and verifies that the value is within range");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F00 && TSTAT.S.A0015 && TSTAT.S.A0016"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::UnoccupiedHeatingSetpoint::Id, true, chip::NullOptional);
        }
        case 55: {
            LogStep(55, "Reads UnoccupiedHeatingSetpoint attribute from Server DUT and verifies that the value is within range");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F00 && !TSTAT.S.A0015 && !TSTAT.S.A0016"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::UnoccupiedHeatingSetpoint::Id, true, chip::NullOptional);
        }
        case 56: {
            LogStep(56, "Writes a value back that is different but valid for UnoccupiedHeatingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 2500;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::UnoccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 57: {
            LogStep(57, "Reads it back again to confirm the successful write of UnoccupiedHeatingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::UnoccupiedHeatingSetpoint::Id, true, chip::NullOptional);
        }
        case 58: {
            LogStep(58, "Writes UnoccupiedHeatingSetpoint to value below the MinHeatSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F00 && !TSTAT.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 500;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::UnoccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 59: {
            LogStep(59, "Writes UnoccupiedHeatingSetpoint to value below the MinHeatSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F00 && TSTAT.S.A0015 && PICS_SKIP_SAMPLE_APP"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' after successgarbage: not in length on purpose", 30);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 60: {
            LogStep(60, "Writes UnoccupiedHeatingSetpoint to value above the MaxHeatSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F00 && !TSTAT.S.A0016"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 4010;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::UnoccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 61: {
            LogStep(61, "Writes UnoccupiedHeatingSetpoint to value above the MaxHeatSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F00 && TSTAT.S.A0016"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = static_cast<int16_t>(MaxHeatSetpointLimit + 1000);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::UnoccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 62: {
            LogStep(62, "Writes the limit of MinHeatSetpointLimit to UnoccupiedHeatingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F00 && !TSTAT.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 700;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::UnoccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 63: {
            LogStep(63, "Writes the limit of MinHeatSetpointLimit to UnoccupiedHeatingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F00 && TSTAT.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = MinHeatSetpointLimit;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::UnoccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 64: {
            LogStep(64, "Writes the limit of MaxHeatSetpointLimit to UnoccupiedHeatingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F00 && !TSTAT.S.A0016 && !TSTAT.S.F05"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 3000;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::UnoccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 65: {
            LogStep(65, "Writes the limit of MaxHeatSetpointLimit to UnoccupiedHeatingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F00 && TSTAT.S.A0016 && !TSTAT.S.F05"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = MaxHeatSetpointLimit;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::UnoccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 66: {
            LogStep(66, "Writes the limit of MaxHeatSetpointLimit to UnoccupiedHeatingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F00 && !TSTAT.S.A0016 && TSTAT.S.F05"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 3000;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::UnoccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 67: {
            LogStep(67,
                    "Writes If TSTAT.S.F05(AUTO) UpperLimit = Min(MaxHeatSetpointLimit, (UnoccupiedCoolingSetpoint - "
                    "MinSetpointDeadBand)) to UnoccupiedHeatingSetpoint attribute when Auto is enabled.");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F00 && TSTAT.S.A0013 && TSTAT.S.F05 && PICS_SKIP_SAMPLE_APP"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' after successgarbage: not in length on purpose", 30);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 68: {
            LogStep(68, "Reads MinHeatSetpointLimit attribute from Server DUT and verifies that the value is within range");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && TSTAT.S.A0015 && TSTAT.S.A0016 && TSTAT.S.A0003"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinHeatSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 69: {
            LogStep(69, "Reads MinHeatSetpointLimit attribute from Server DUT and verifies that the value is within range");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && TSTAT.S.A0015 && !TSTAT.S.A0016 && !TSTAT.S.A0003"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinHeatSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 70: {
            LogStep(70, "Writes a value back that is different but valid for MinHeatSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && TSTAT.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 800;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 71: {
            LogStep(71, "Reads it back again to confirm the successful write of MinHeatSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinHeatSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 72: {
            LogStep(72, "Writes a value back that is different but violates the deadband");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0015 && TSTAT.S.F05"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 2000;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 73: {
            LogStep(73, "Writes MinHeatSetpointLimit to value below the AbsMinHeatSetpointLimit ");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && TSTAT.S.A0015 && !TSTAT.S.A0003"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 100;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 74: {
            LogStep(74, "Writes MinHeatSetpointLimit to value below the AbsMinHeatSetpointLimit ");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && TSTAT.S.A0015 && TSTAT.S.A0003 && PICS_SKIP_SAMPLE_APP"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' after successgarbage: not in length on purpose", 30);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 75: {
            LogStep(75, "Writes MinHeatSetpointLimit to value above the AbsMaxHeatSetpointLimit ");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0015 && !TSTAT.S.A0016"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 4050;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 76: {
            LogStep(76, "Writes MinHeatSetpointLimit to value above the AbsMaxHeatSetpointLimit ");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0015 && TSTAT.S.A0016"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = static_cast<int16_t>(MaxHeatSetpointLimit + 1000);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 77: {
            LogStep(77, "Writes the limit of AbsMinHeatSetpointLimit to MinHeatSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0015 && !TSTAT.S.A0003"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 700;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 78: {
            LogStep(78, "Writes the limit of AbsMinHeatSetpointLimit to MinHeatSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0015 && TSTAT.S.A0003"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = AbsMinHeatSetpointLimitValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 79: {
            LogStep(79, "Writes the limit of MaxHeatSetpointLimit to MinHeatSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0015 && !TSTAT.S.F05 && !TSTAT.S.A0016"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 3000;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 80: {
            LogStep(80, "Writes the limit of MaxHeatSetpointLimit to MinHeatSetpointimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0015 && !TSTAT.S.F05 && TSTAT.S.A0016"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = MaxHeatSetpointLimit;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 81: {
            LogStep(81,
                    "Writes If TSTAT.S.F05(AUTO) UpperLimit = Min(MaxHeatSetpointLimit, (MinCoolSetpointLimit - "
                    "MinSetpointDeadBand)) to MinHeatSetpointLimit attribute when Auto is enabled");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0015 && TSTAT.S.F05 && TSTAT.S.A0005 && PICS_SKIP_SAMPLE_APP"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' after successgarbage: not in length on purpose", 30);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 82: {
            LogStep(82, "Reads MaxHeatSetpointLimit attribute from Server DUT and verifies that the value is within range");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0016 && !TSTAT.S.F05 && TSTAT.S.A0004 && TSTAT.S.A0016"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxHeatSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 83: {
            LogStep(83, "Reads MaxHeatSetpointLimit attribute from Server DUT and verifies that the value is within range");
            VerifyOrDo(!ShouldSkip(" TSTAT.S.F00  && TSTAT.S.A0016 && !TSTAT.S.F05 && !TSTAT.S.A0004 && !TSTAT.S.A0016 "),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxHeatSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 84: {
            LogStep(84, "Writes the limit of AbsMinHeatSetpointLimit to MinHeatSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 700;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 85: {
            LogStep(85, "Writes the limit of AbsMaxHeatSetpointLimit to MinHeatSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0015 && TSTAT.S.F05"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 3000;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 86: {
            LogStep(86, "Writes a value back that is different but valid for MaxHeatSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && TSTAT.S.A0016 && !TSTAT.S.F05"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 2900;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 87: {
            LogStep(87, "Reads it back again to confirm the successful write of MaxHeatSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && TSTAT.S.A0016 && !TSTAT.S.F05"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxHeatSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 88: {
            LogStep(88, "Writes MaxHeatSetpointLimit to value below the AbsMinHeatSetpointLimit ");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0016 && !TSTAT.S.A0015"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 500;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 89: {
            LogStep(89, "Writes MaxHeatSetpointLimit to value below the MinHeatSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0016 && TSTAT.S.A0015 && PICS_SKIP_SAMPLE_APP"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' after successgarbage: not in length on purpose", 30);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 90: {
            LogStep(90, "Writes MaxHeatSetpointLimit to value above the AbsMaxHeatSetpointLimit ");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0016 && !TSTAT.S.A0004"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 4000;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 91: {
            LogStep(91, "Writes MaxHeatSetpointLimit to value above the AbsMaxHeatSetpointLimit ");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0016 && TSTAT.S.A0004"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = static_cast<int16_t>(AbsMaxHeatSetpointLimitValue + 1000);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 92: {
            LogStep(92, "Writes the limit of MinHeatSetpointLimit to MaxHeatSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0016 && !TSTAT.S.A0015"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 700;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 93: {
            LogStep(93, "Writes the limit of MinHeatSetpointLimit to MaxHeatSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && TSTAT.S.A0016 && TSTAT.S.A0015"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = MinHeatSetpointLimit;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 94: {
            LogStep(94, "Writes the limit of AbsMaxHeatSetpointLimit to MaxHeatSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0016 && !TSTAT.S.F05 && !TSTAT.S.A0004"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 3000;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 95: {
            LogStep(95, "Writes the limit of AbsMaxHeatSetpointLimit to MaxHeatSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && TSTAT.S.A0016 && !TSTAT.S.F05 && TSTAT.S.A0004"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = AbsMaxHeatSetpointLimitValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 96: {
            LogStep(96,
                    "Writes If TSTAT.S.F05(AUTO) UpperLimit = Min(AbsMaxHeatSetpointLimit, (MaxCoolSetpointLimit - "
                    "MinSetpointDeadBand)) to MaxHeatSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && TSTAT.S.A0016 && TSTAT.S.F05 && TSTAT.S.A0018 && PICS_SKIP_SAMPLE_APP"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' after successgarbage: not in length on purpose", 30);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 97: {
            LogStep(97, "Reads MinCoolSetpointLimit attribute from Server DUT and verifies that the value is within range");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017 && TSTAT.S.A0018 && TSTAT.S.A0005"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinCoolSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 98: {
            LogStep(98, "Reads MinCoolSetpointLimit attribute from Server DUT and verifies that the value is within range");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017 && !TSTAT.S.A0018 && !TSTAT.S.A0005"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinCoolSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 99: {
            LogStep(99, "Writes a value back that is different but valid for MinCoolSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 2000;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinCoolSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 100: {
            LogStep(100, "Reads it back again to confirm the successful write of MinCoolSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinCoolSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 101: {
            LogStep(101, "Writes MinCoolSetpointLimit to value below the AbsMinCoolSetpointLimit ");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017 && !TSTAT.S.A0005"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 1000;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinCoolSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 102: {
            LogStep(102, "Writes MinCoolSetpointLimit to value below the AbsMinCoolSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017 && TSTAT.S.A0005 && PICS_SKIP_SAMPLE_APP"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' after successgarbage: not in length on purpose", 30);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 103: {
            LogStep(103, "Writes MinCoolSetpointLimit to value above the MaxCoolSetpointLimit ");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017 && !TSTAT.S.A0018"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 4000;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinCoolSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 104: {
            LogStep(104, "Writes MinCoolSetpointLimit to value above the MaxCoolSetpointLimit ");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017 && TSTAT.S.A0018"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = static_cast<int16_t>(MaxCoolSetpointLimit + 1000);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinCoolSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 105: {
            LogStep(105, "Writes the limit of AbsMinCoolSetpointLimit to MinCoolSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017 && !TSTAT.S.A0005 && !TSTAT.S.F05"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 1600;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinCoolSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 106: {
            LogStep(106, "Writes the limit of AbsMinCoolSetpointLimit to MinCoolSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017 && TSTAT.S.A0005 && !TSTAT.S.F05"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = AbsMinCoolSetpointLimit;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinCoolSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 107: {
            LogStep(107,
                    "Writes If TSTAT.S.F05(AUTO) LowerLimit = Max(AbsMinCoolSetpointLimit, (MinHeatSetpointLimit + "
                    "MinSetpointDeadBand)) to MinCoolSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017 && TSTAT.S.A0015 && TSTAT.S.F05 && PICS_SKIP_SAMPLE_APP"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' after successgarbage: not in length on purpose", 30);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 108: {
            LogStep(108, "Writes the limit of MaxCoolSetpointLimit to MinCoolSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017 && !TSTAT.S.A0018"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 3200;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinCoolSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 109: {
            LogStep(109, "Writes the limit of MaxCoolSetpointLimit to MinCoolSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017 && TSTAT.S.A0018"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = MaxCoolSetpointLimit;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinCoolSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 110: {
            LogStep(110, "Reads MaxCoolSetpointLimit attribute from Server DUT and verifies that the value is within range");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0018 && TSTAT.S.A0017 && TSTAT.S.A0006"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxCoolSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 111: {
            LogStep(111, "Reads MaxCoolSetpointLimit attribute from Server DUT and verifies that the value is within range");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0018 && !TSTAT.S.A0017 && !TSTAT.S.A0006"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxCoolSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 112: {
            LogStep(112, "Writes a value back that is different but valid for MaxCoolSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0018 && !TSTAT.S.F05"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 2000;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxCoolSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 113: {
            LogStep(113, "Reads it back again to confirm the successful write of MaxCoolSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0018 && !TSTAT.S.F05"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxCoolSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 114: {
            LogStep(114, "Writes MaxCoolSetpointLimit to value below the AbsMinCoolSetpointLimit ");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0018 && !TSTAT.S.A0017"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 1000;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxCoolSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 115: {
            LogStep(115, "Writes MaxCoolSetpointLimit to value below the AbsMinCoolSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0018 && TSTAT.S.A0017 && PICS_SKIP_SAMPLE_APP"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' after successgarbage: not in length on purpose", 30);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 116: {
            LogStep(116, "Writes MaxCoolSetpointLimit to value above the MaxCoolSetpointLimit ");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0018 && !TSTAT.S.A0006"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 4000;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxCoolSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 117: {
            LogStep(117, "Writes MaxCoolSetpointLimit to value above the MaxCoolSetpointLimit ");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0018 && TSTAT.S.A0006"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = static_cast<int16_t>(AbsMaxCoolSetpointLimit + 1000);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxCoolSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 118: {
            LogStep(118, "Writes the limit of MinCoolSetpointLimit to MaxCoolSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0018 && !TSTAT.S.A0017 && !TSTAT.S.F05"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 1600;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxCoolSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 119: {
            LogStep(119, "Writes the limit of MinCoolSetpointLimit to MaxCoolSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0018 && !TSTAT.S.A0017 && TSTAT.S.F05"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 1600;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxCoolSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 120: {
            LogStep(120, "Writes the limit of MinCoolSetpointLimit to MaxCoolSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0018 && TSTAT.S.A0017 && !TSTAT.S.F05"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = MinCoolSetpointLimit;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxCoolSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 121: {
            LogStep(121,
                    "Writes If TSTAT.S.F05(AUTO) LowerLimit = Max(MinCoolSetpointLimit, (MaxHeatSetpointLimit + "
                    "MinSetpointDeadBand)) to MaxCoolSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0018 && TSTAT.S.A0016 && TSTAT.S.F05 && PICS_SKIP_SAMPLE_APP"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' after successgarbage: not in length on purpose", 30);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 122: {
            LogStep(122, "Writes the limit of AbsMaxCoolSetpointLimit to MaxCoolSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0018 && !TSTAT.S.A0006"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 3200;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxCoolSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 123: {
            LogStep(123, "Writes the limit of AbsMaxCoolSetpointLimit to MaxCoolSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0018 && TSTAT.S.A0006"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = AbsMaxCoolSetpointLimit;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxCoolSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 124: {
            LogStep(124, "Writes (sets back) default value of MinHeatSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 700;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 125: {
            LogStep(125, "Writes (sets back)default value of MaxHeatSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0016 && !TSTAT.S.F05"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 3000;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 126: {
            LogStep(126, "Writes MaxHeatSetpointLimit That meets the deadband of 2.5C");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0016 && !TSTAT.S.F05"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 2950;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 127: {
            LogStep(127, "Writes (sets back) default value of MinCoolSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 1600;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinCoolSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 128: {
            LogStep(128, "Writes (sets back) default value of MaxCoolSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0018"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 3200;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxCoolSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 129: {
            LogStep(129, "Reads MinSetpointDeadBand attribute from Server DUT and verifies that the value is within range");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F05"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinSetpointDeadBand::Id,
                                 true, chip::NullOptional);
        }
        case 130: {
            LogStep(130, "Writes a value back that is different but valid for MinSetpointDeadBand attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F05 && TSTAT.S.M.MinSetpointDeadBandWritable"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int8_t value;
            value = 5;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinSetpointDeadBand::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 131: {
            LogStep(131, "Reads it back again to confirm the successful write of MinSetpointDeadBand attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F05 && TSTAT.S.M.MinSetpointDeadBandWritable"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinSetpointDeadBand::Id,
                                 true, chip::NullOptional);
        }
        case 132: {
            LogStep(132, "Writes the value below MinSetpointDeadBand");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F05 && TSTAT.S.M.MinSetpointDeadBandWritable"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int8_t value;
            value = -1;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinSetpointDeadBand::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 133: {
            LogStep(133, "Writes the value above MinSetpointDeadBand ");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F05 && TSTAT.S.M.MinSetpointDeadBandWritable"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int8_t value;
            value = 30;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinSetpointDeadBand::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 134: {
            LogStep(134, "Writes the min limit of MinSetpointDeadBand");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F05 && TSTAT.S.M.MinSetpointDeadBandWritable"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int8_t value;
            value = 0;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinSetpointDeadBand::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 135: {
            LogStep(135, "Writes the max limit of MinSetpointDeadBand");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F05 && TSTAT.S.M.MinSetpointDeadBandWritable"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int8_t value;
            value = 25;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinSetpointDeadBand::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 136: {
            LogStep(136, "Reads ControlSequenceOfOperation from Server DUT and verifies that the value is valid");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 || TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::ControlSequenceOfOperation::Id, true, chip::NullOptional);
        }
        case 137: {
            LogStep(137, "Write Attribute command for ControlSequenceOfOperation with a new valid value");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 || TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Thermostat::ThermostatControlSequence value;
            value = static_cast<chip::app::Clusters::Thermostat::ThermostatControlSequence>(2);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::ControlSequenceOfOperation::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 138: {
            LogStep(138, "Read it back again to confirm the successful write");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 || TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::ControlSequenceOfOperation::Id, true, chip::NullOptional);
        }
        case 139: {
            LogStep(139, "Writes MaxHeatSetpointLimit attribute to default value of 2950 to meet deadband constraint");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && TSTAT.S.A0015 && TSTAT.S.F05"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 2950;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 140: {
            LogStep(140, "Sets OccupiedCoolingSetpoint to default value");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 2600;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedCoolingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 141: {
            LogStep(141, "Sets OccupiedHeatingSetpoint to default value");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 2000;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 142: {
            LogStep(142, "Sends SetpointRaise Command Heat Only");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Thermostat::Commands::SetpointRaiseLower::Type value;
            value.mode   = static_cast<chip::app::Clusters::Thermostat::SetpointAdjustMode>(0);
            value.amount = -30;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Commands::SetpointRaiseLower::Id, value,
                               chip::NullOptional

            );
        }
        case 143: {
            LogStep(143, "Reads back OccupiedHeatingSetpoint to confirm the success of the write");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::OccupiedHeatingSetpoint::Id, true, chip::NullOptional);
        }
        case 144: {
            LogStep(144, "Sets OccupiedHeatingSetpoint to default value");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 2000;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 145: {
            LogStep(145, "Sends SetpointRaise Command Heat Only");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Thermostat::Commands::SetpointRaiseLower::Type value;
            value.mode   = static_cast<chip::app::Clusters::Thermostat::SetpointAdjustMode>(0);
            value.amount = 30;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Commands::SetpointRaiseLower::Id, value,
                               chip::NullOptional

            );
        }
        case 146: {
            LogStep(146, "Reads back OccupiedHeatingSetpoint to confirm the success of the write");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::OccupiedHeatingSetpoint::Id, true, chip::NullOptional);
        }
        case 147: {
            LogStep(147, "Sends SetpointRaise Command Cool Only");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Thermostat::Commands::SetpointRaiseLower::Type value;
            value.mode   = static_cast<chip::app::Clusters::Thermostat::SetpointAdjustMode>(1);
            value.amount = -30;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Commands::SetpointRaiseLower::Id, value,
                               chip::NullOptional

            );
        }
        case 148: {
            LogStep(148, "Reads back OccupiedCoolingSetpoint to confirm the success of the write");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::OccupiedCoolingSetpoint::Id, true, chip::NullOptional);
        }
        case 149: {
            LogStep(149, "Sets OccupiedCoolingSetpoint to default value");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 2600;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedCoolingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 150: {
            LogStep(150, "Sends SetpointRaise Command Cool Only");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Thermostat::Commands::SetpointRaiseLower::Type value;
            value.mode   = static_cast<chip::app::Clusters::Thermostat::SetpointAdjustMode>(1);
            value.amount = 30;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Commands::SetpointRaiseLower::Id, value,
                               chip::NullOptional

            );
        }
        case 151: {
            LogStep(151, "Reads back OccupiedCoolingSetpoint to confirm the success of the write");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::OccupiedCoolingSetpoint::Id, true, chip::NullOptional);
        }
        case 152: {
            LogStep(152, "Sets OccupiedCoolingSetpoint to default value");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 2600;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedCoolingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 153: {
            LogStep(153, "Sets OccupiedHeatingSetpoint to default value");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 2000;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 154: {
            LogStep(154, "Sends SetpointRaise Command Heat & Cool");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 || TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Thermostat::Commands::SetpointRaiseLower::Type value;
            value.mode   = static_cast<chip::app::Clusters::Thermostat::SetpointAdjustMode>(2);
            value.amount = -30;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Commands::SetpointRaiseLower::Id, value,
                               chip::NullOptional

            );
        }
        case 155: {
            LogStep(155, "Reads back OccupiedCoolingSetpoint to confirm the success of the write");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::OccupiedCoolingSetpoint::Id, true, chip::NullOptional);
        }
        case 156: {
            LogStep(156, "Reads back OccupiedHeatingSetpoint to confirm the success of the write");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::OccupiedHeatingSetpoint::Id, true, chip::NullOptional);
        }
        case 157: {
            LogStep(157, "Sets OccupiedCoolingSetpoint to default value");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 2600;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedCoolingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 158: {
            LogStep(158, "Sets OccupiedHeatingSetpoint to default value");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 2000;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 159: {
            LogStep(159, "Sends SetpointRaise Command Heat & Cool");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 || TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Thermostat::Commands::SetpointRaiseLower::Type value;
            value.mode   = static_cast<chip::app::Clusters::Thermostat::SetpointAdjustMode>(2);
            value.amount = 30;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Commands::SetpointRaiseLower::Id, value,
                               chip::NullOptional

            );
        }
        case 160: {
            LogStep(160, "Reads back OccupiedCoolingSetpoint to confirm the success of the write");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::OccupiedCoolingSetpoint::Id, true, chip::NullOptional);
        }
        case 161: {
            LogStep(161, "Reads back OccupiedHeatingSetpoint to confirm the success of the write");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::OccupiedHeatingSetpoint::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_TSUIC_1_1Suite : public TestCommand
{
public:
    Test_TC_TSUIC_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_TSUIC_1_1", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_TSUIC_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 2U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH read ClusterRevision attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                 ThermostatUserInterfaceConfiguration::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read FeatureMap attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                 ThermostatUserInterfaceConfiguration::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                 ThermostatUserInterfaceConfiguration::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                 ThermostatUserInterfaceConfiguration::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                 ThermostatUserInterfaceConfiguration::Attributes::GeneratedCommandList::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_TSUIC_2_1Suite : public TestCommand
{
public:
    Test_TC_TSUIC_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_TSUIC_2_1", 4, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_TSUIC_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 1U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 5U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 1U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read the mandatory attribute: TemperatureDisplayMode");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                 ThermostatUserInterfaceConfiguration::Attributes::TemperatureDisplayMode::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the mandatory attribute: KeypadLockout");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                 ThermostatUserInterfaceConfiguration::Attributes::KeypadLockout::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the optional attribute: ScheduleProgrammingVisibility");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                 ThermostatUserInterfaceConfiguration::Attributes::ScheduleProgrammingVisibility::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_TSUIC_2_2Suite : public TestCommand
{
public:
    Test_TC_TSUIC_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_TSUIC_2_2", 37, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_TSUIC_2_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("temperatureDisplayMode", value, 1U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("temperatureDisplayMode", value, 1U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("keypadLockout", value, 0U));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("keypadLockout", value, 1U));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("keypadLockout", value, 2U));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("keypadLockout", value, 3U));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("keypadLockout", value, 4U));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("keypadLockout", value, 5U));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("keypadLockout", value, 5U));
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("scheduleProgrammingVisibility", value, 0U));
            }
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("scheduleProgrammingVisibility", value, 1U));
            }
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("scheduleProgrammingVisibility", value, 1U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Writes a value of 0 to TemperatureDisplayMode attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                  ThermostatUserInterfaceConfiguration::Attributes::TemperatureDisplayMode::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Verify device temperature displayed in °C");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && TSUIC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "TH reads the TemperatureDisplayMode attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                 ThermostatUserInterfaceConfiguration::Attributes::TemperatureDisplayMode::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Writes a value of 1 to TemperatureDisplayMode attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 1U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                  ThermostatUserInterfaceConfiguration::Attributes::TemperatureDisplayMode::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Verify device temperature displayed in °F");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && TSUIC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6, "TH reads the TemperatureDisplayMode attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                 ThermostatUserInterfaceConfiguration::Attributes::TemperatureDisplayMode::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Writes a value of greater than 1 to TemperatureDisplayMode attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 2U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                  ThermostatUserInterfaceConfiguration::Attributes::TemperatureDisplayMode::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH reads the TemperatureDisplayMode attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                 ThermostatUserInterfaceConfiguration::Attributes::TemperatureDisplayMode::Id, true,
                                 chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Writes a value of 0 to KeypadLockout attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                  ThermostatUserInterfaceConfiguration::Attributes::KeypadLockout::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Verify all device functionality available to the user");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && TSUIC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 11: {
            LogStep(11, "TH reads the KeypadLockout attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                 ThermostatUserInterfaceConfiguration::Attributes::KeypadLockout::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Writes a value of 1 to KeypadLockout attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 1U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                  ThermostatUserInterfaceConfiguration::Attributes::KeypadLockout::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Verify device operates at Level 1 reduced functionality");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && TSUIC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14, "TH reads the KeypadLockout attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                 ThermostatUserInterfaceConfiguration::Attributes::KeypadLockout::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Writes a value of 2 to KeypadLockout attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 2U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                  ThermostatUserInterfaceConfiguration::Attributes::KeypadLockout::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Verify device operates at Level 2 reduced functionality");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && TSUIC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17, "TH reads the KeypadLockout attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                 ThermostatUserInterfaceConfiguration::Attributes::KeypadLockout::Id, true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Writes a value of 3 to KeypadLockout attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 3U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                  ThermostatUserInterfaceConfiguration::Attributes::KeypadLockout::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Verify device operates at Level 3 reduced functionality");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && TSUIC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 20: {
            LogStep(20, "TH reads the KeypadLockout attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                 ThermostatUserInterfaceConfiguration::Attributes::KeypadLockout::Id, true, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "Writes a value of 4 to KeypadLockout attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 4U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                  ThermostatUserInterfaceConfiguration::Attributes::KeypadLockout::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Verify device operates at Level 4 reduced functionality");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && TSUIC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 23: {
            LogStep(23, "TH reads the KeypadLockout attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                 ThermostatUserInterfaceConfiguration::Attributes::KeypadLockout::Id, true, chip::NullOptional);
        }
        case 24: {
            LogStep(24, "Writes a value of 5 to KeypadLockout attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 5U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                  ThermostatUserInterfaceConfiguration::Attributes::KeypadLockout::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 25: {
            LogStep(25, "Verify device operates at least functionality level");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && TSUIC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 26: {
            LogStep(26, "TH reads the KeypadLockout attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                 ThermostatUserInterfaceConfiguration::Attributes::KeypadLockout::Id, true, chip::NullOptional);
        }
        case 27: {
            LogStep(27, "Writes a value of greater than 5 to KeypadLockout attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 6U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                  ThermostatUserInterfaceConfiguration::Attributes::KeypadLockout::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 28: {
            LogStep(28, "TH reads the KeypadLockout attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                 ThermostatUserInterfaceConfiguration::Attributes::KeypadLockout::Id, true, chip::NullOptional);
        }
        case 29: {
            LogStep(29, "Writes a value of 0 to ScheduleProgrammingVisibility attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                  ThermostatUserInterfaceConfiguration::Attributes::ScheduleProgrammingVisibility::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 30: {
            LogStep(30, "Verify local schedule programming functionality is enabled at the thermostat");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && TSUIC.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 31: {
            LogStep(31, "TH reads the ScheduleProgrammingVisibility attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                 ThermostatUserInterfaceConfiguration::Attributes::ScheduleProgrammingVisibility::Id, true,
                                 chip::NullOptional);
        }
        case 32: {
            LogStep(32, "Writes a value of 1 to ScheduleProgrammingVisibility attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 1U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                  ThermostatUserInterfaceConfiguration::Attributes::ScheduleProgrammingVisibility::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 33: {
            LogStep(33, "Verify local schedule programming functionality is disabled at the thermostat");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && TSUIC.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 34: {
            LogStep(34, "TH reads the ScheduleProgrammingVisibility attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                 ThermostatUserInterfaceConfiguration::Attributes::ScheduleProgrammingVisibility::Id, true,
                                 chip::NullOptional);
        }
        case 35: {
            LogStep(35, "Writes a value of greater than 1 to ScheduleProgrammingVisibility attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 2U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                  ThermostatUserInterfaceConfiguration::Attributes::ScheduleProgrammingVisibility::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 36: {
            LogStep(36, "TH reads the ScheduleProgrammingVisibility attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                 ThermostatUserInterfaceConfiguration::Attributes::ScheduleProgrammingVisibility::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGTHREAD_1_1Suite : public TestCommand
{
public:
    Test_TC_DGTHREAD_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_DGTHREAD_1_1", 56, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGTHREAD_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 2UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 4UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 8UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 7UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 8UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 9UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 10UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 11UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 12UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 13UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 59UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 60UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 61UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 62UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 6UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 14UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 15UL));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 16UL));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 17UL));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 18UL));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 19UL));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 20UL));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 21UL));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 22UL));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 23UL));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 24UL));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 25UL));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 26UL));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 27UL));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 28UL));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 29UL));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 30UL));
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 31UL));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 32UL));
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 33UL));
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 34UL));
            }
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 35UL));
            }
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 36UL));
            }
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 37UL));
            }
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 38UL));
            }
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 39UL));
            }
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 40UL));
            }
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 41UL));
            }
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 42UL));
            }
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 43UL));
            }
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 44UL));
            }
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 45UL));
            }
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 46UL));
            }
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 47UL));
            }
            break;
        case 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 48UL));
            }
            break;
        case 44:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 49UL));
            }
            break;
        case 45:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 50UL));
            }
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 51UL));
            }
            break;
        case 47:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 52UL));
            }
            break;
        case 48:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 53UL));
            }
            break;
        case 49:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 54UL));
            }
            break;
        case 50:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 55UL));
            }
            break;
        case 51:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 56UL));
            }
            break;
        case 52:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 57UL));
            }
            break;
        case 53:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 58UL));
            }
            break;
        case 54:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 55:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH reads the ClusterRevision from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads the FeatureMap from DUT");
            VerifyOrDo(!ShouldSkip(" !DGTHREAD.S.F00 && !DGTHREAD.S.F01 && !DGTHREAD.S.F02 && !DGTHREAD.S.F03 "),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Given DGTHREAD.S.F00(PKTCNT) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Given DGTHREAD.S.F01(ERRCNT) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Given DGTHREAD.S.F02(MLECNT) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Given DGTHREAD.S.F03(MACCNT) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH reads mandatory attributes in AttributeList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH reads Feature dependent attribute(DGTHREAD.S.F01(ERRCNT)) in attributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.C.A0006 && DGTHREAD.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "TH reads optional attribute (DetachedRoleCount) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "TH reads optional attribute (ChildRoleCount) AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A001f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "TH reads optional attribute (RouterRoleCount) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "TH reads optional attribute (LeaderRoleCount) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "TH reads optional attribute (AttachAttemptCount) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "TH reads optional attribute (PartitionIdChangeCount) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0013"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "TH reads optional attribute (BetterPartitionAttachAttemptCount) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0014"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "TH reads optional attribute (ParentChangeCount) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "TH reads optional attribute (TxTotalCount) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0016"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "TH reads optional attribute (TxUnicastCount) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "TH reads optional attribute (TxBroadcastCount) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0018"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "TH reads optional attribute (TxAckRequestedCount) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0019"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "TH reads optional attribute (TxAckedCount) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A001a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "TH reads optional attribute (TxNoAckRequestedCount) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A001b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "TH reads optional attributes (TxDataCount) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A001c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 24: {
            LogStep(24, "TH reads optional attribute (TxDataPollCount) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A001d"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 25: {
            LogStep(25, "TH reads optional attribute (TxBeaconCount) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A001e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 26: {
            LogStep(26, "TH reads optional attribute (TxBeaconRequestCount) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A001f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 27: {
            LogStep(27, "TH reads optional attribute (TxOtherCount) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0020"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 28: {
            LogStep(28, "TH reads optional attribute (TxRetryCount) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0021"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 29: {
            LogStep(29, "TH reads optional attribute (TxDirectMaxRetryExpiryCount) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0022"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 30: {
            LogStep(30, "TH reads optional attribute (TxIndirectMaxRetryExpiryCount) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0023"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 31: {
            LogStep(31, "TH reads optional attribute (TxErrCcaCount) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0024"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 32: {
            LogStep(32, "TH reads optional attribute (TxErrAbortCount) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0025"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 33: {
            LogStep(33, "TH reads optional attribute (TxErrBusyChannelCount) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0026"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 34: {
            LogStep(34, "TH reads optional attribute (RxTotalCount) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0027"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 35: {
            LogStep(35, "TH reads optional attribute (RxUnicastCount) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0028"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 36: {
            LogStep(36, "TH reads optional attribute (RxBroadcastCount) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0029"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 37: {
            LogStep(37, "TH reads optional attribute (RxDataCount) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A002a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 38: {
            LogStep(38, "TH reads optional attribute (RxDataPollCount) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A002b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 39: {
            LogStep(39, "TH reads optional attribute (RxBeaconCount) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A002c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 40: {
            LogStep(40, "TH reads optional attribute (RxBeaconRequestCount) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A002d"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 41: {
            LogStep(41, "TH reads optional attribute (RxOtherCount) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A002e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 42: {
            LogStep(42, "TH reads optional attribute (RxAddressFilteredCount) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A002f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 43: {
            LogStep(43, "TH reads optional attribute (RxDestAddrFilteredCount) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0030"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 44: {
            LogStep(44, "TH reads optional attribute (RxDuplicatedCount) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0031"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 45: {
            LogStep(45, "TH reads optional attribute (RxErrNoFrameCount) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0032"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 46: {
            LogStep(46, "TH reads optional attribute (RxErrUnknownNeighborCount) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0033"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 47: {
            LogStep(47, "TH reads optional attribute (RxErrInvalidScrAddrCount) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0034"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 48: {
            LogStep(48, "TH reads optional attribute (RxErrSecCount) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0035"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 49: {
            LogStep(49, "TH reads optional attribute (RxErrFcsCount) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0036"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 50: {
            LogStep(50, "TH reads optional attribute (RxErrOtherCount) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0037"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 51: {
            LogStep(51, "Read the optional attribute (ActiveTimestamp) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0039"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 52: {
            LogStep(52, "Read the optional attribute (PendingTimestamp) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A003A"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 53: {
            LogStep(53, "Read the optional attribute (Delay) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A003B"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 54: {
            LogStep(54, "TH reads AcceptedCommandList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 55: {
            LogStep(55, "TH reads GeneratedCommandList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGTHREAD_2_1Suite : public TestCommand
{
public:
    Test_TC_DGTHREAD_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_DGTHREAD_2_1", 34, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGTHREAD_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::ThreadNetworkDiagnostics::RoutingRole> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 6U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::CharSpan> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int64u", "int64u"));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int64u", "int64u"));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int64u", "int64u"));
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int64u", "int64u"));
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::ByteSpan> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "octet_string", "octet_string"));
            }
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::ThreadNetworkDiagnostics::NetworkFault> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH reads Channel attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::Channel::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads RoutingRole attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::RoutingRole::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH reads Network Name attribute value from DUT and Verify that Network name is of the type string");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::NetworkName::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4,
                    "Read NetworkName attribute from DUT and verify response value, If value is NULL then verify that RoutingRole "
                    "is set to 1");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DGTHREAD.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "TH reads PanId attribute value from DUT and Verify that PanId is of the type uint16");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::PanId::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6,
                    "Read PanId attribute from DUT and verify response value, If value is NULL then verify that RoutingRole is set "
                    "to 1");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DGTHREAD.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "TH reads ExtendedPanId attribute value from DUT and Verify that ExtendedPanId is of the type uint64");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::ExtendedPanId::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8,
                    "Read ExtendedPanId attribute from DUT and verify response value, If value is NULL then verify that "
                    "RoutingRole is set to 1");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DGTHREAD.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9,
                    "Read MeshLocalPrefix attribute from DUT and verify response value, If value is NULL then verify that "
                    "RoutingRole is set to 1");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DGTHREAD.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "TH reads OverrunCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::OverrunCount::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(
                11,
                "read OverrunCount attribute from DUT and verify response value, If the Overruncount is greater than zero or not");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DGTHREAD.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 12: {
            LogStep(12,
                    "read NeighborTableList attribute from DUT and Verify that the NeighborTable List size is Zero or greater and "
                    "verify each node types");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DGTHREAD.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13,
                    "Read RouteTableList attribute from DUT and Verify that the RouteTableList List size is Zero or greater and "
                    "verify each node types");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DGTHREAD.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14, "TH reads PartitionId attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0009"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::PartitionId::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "TH reads Weighting attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::Weighting::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "TH reads DataVersion attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A000b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::DataVersion::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "TH reads StableDataVersion attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A000c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::StableDataVersion::Id, true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "TH reads LeaderRouterId attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A000d"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::LeaderRouterId::Id, true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "TH reads DetachedRoleCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::DetachedRoleCount::Id, true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "TH reads ChildRoleCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A001f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::ChildRoleCount::Id, true, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "TH reads RouterRoleCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::RouterRoleCount::Id, true, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "TH reads LeaderRoleCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::LeaderRoleCount::Id, true, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "TH reads AttachAttemptCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttachAttemptCount::Id, true, chip::NullOptional);
        }
        case 24: {
            LogStep(24, "TH reads PartitionIdChangeCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0013"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::PartitionIdChangeCount::Id, true, chip::NullOptional);
        }
        case 25: {
            LogStep(25, "TH reads BetterPartitionAttachAttemptCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0014"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::BetterPartitionAttachAttemptCount::Id, true,
                                 chip::NullOptional);
        }
        case 26: {
            LogStep(26, "TH reads ParentChangeCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::ParentChangeCount::Id, true, chip::NullOptional);
        }
        case 27: {
            LogStep(27, "TH reads ActiveTimestamp attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0038"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::ActiveTimestamp::Id, true, chip::NullOptional);
        }
        case 28: {
            LogStep(28, "TH reads PendingTimestamp attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0039"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::PendingTimestamp::Id, true, chip::NullOptional);
        }
        case 29: {
            LogStep(29, "TH reads Delay attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A003A"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::Delay::Id, true, chip::NullOptional);
        }
        case 30: {
            LogStep(30, "Read SecurityPolicy struct attribute from DUT and Verify the each field");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DGTHREAD.S.A003B"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 31: {
            LogStep(31, "TH reads ChannelPage0Mask attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A003c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::ChannelPage0Mask::Id, true, chip::NullOptional);
        }
        case 32: {
            LogStep(32, "Read OperationalDatasetComponents struct attribute from DUT and Verify the each field");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DGTHREAD.S.A003d"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 33: {
            LogStep(33, "TH reads ActiveNetworkFaults attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A003e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::ActiveNetworkFaultsList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGTHREAD_2_2Suite : public TestCommand
{
public:
    Test_TC_DGTHREAD_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_DGTHREAD_2_2", 18, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGTHREAD_2_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH reads TxTotalCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0016"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::TxTotalCount::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads TxUnicastCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::TxUnicastCount::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH reads TxBroadcastCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0018"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::TxBroadcastCount::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads TxAckRequestedCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0019"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::TxAckRequestedCount::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads TxAckedCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A001a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::TxAckedCount::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH reads TxNoAckRequestedCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A001b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::TxNoAckRequestedCount::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH reads TxDataCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A001c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::TxDataCount::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH reads TxDataPollCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A001d"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::TxDataPollCount::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "TH reads TxBeaconCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A001e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::TxBeaconCount::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "TH reads TxBeaconRequestCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A001f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::TxBeaconRequestCount::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "TH reads TxOtherCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0020"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::TxOtherCount::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "TH reads TxRetryCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0021"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::TxRetryCount::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "TH reads TxDirectMaxRetryExpiryCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0022"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::TxDirectMaxRetryExpiryCount::Id, true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "TH reads TxIndirectMaxRetryExpiryCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0023"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::TxIndirectMaxRetryExpiryCount::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "TH reads TxErrCcaCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0024"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::TxErrCcaCount::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "TH reads TxErrAbortCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0025"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::TxErrAbortCount::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "TH reads TxErrBusyChannelCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0026"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::TxErrBusyChannelCount::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGTHREAD_2_3Suite : public TestCommand
{
public:
    Test_TC_DGTHREAD_2_3Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_DGTHREAD_2_3", 18, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGTHREAD_2_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH reads RxTotalCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0027"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::RxTotalCount::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads RxUnicastCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0028"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::RxUnicastCount::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH reads RxBroadcastCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0029"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::RxBroadcastCount::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads RxDataCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A002a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::RxDataCount::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads RxDataPollCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A002b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::RxDataPollCount::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH reads RxBeaconCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A002c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::RxBeaconCount::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH reads RxBeaconRequestCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A002d"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::RxBeaconRequestCount::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH reads RxOtherCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A002e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::RxOtherCount::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "TH reads RxAddressFilteredCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A002f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::RxAddressFilteredCount::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "TH reads RxDestAddrFilteredCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0030"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::RxDestAddrFilteredCount::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "TH reads RxDuplicatedCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0031"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::RxDuplicatedCount::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "TH reads RxErrNoFrameCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0032"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::RxErrNoFrameCount::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "TH reads RxErrUnknownNeighborCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0033"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::RxErrUnknownNeighborCount::Id, true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "TH reads RxErrInvalidScrAddrCount attribute value from DUT and verify data type");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DGTHREAD.S.A0034"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 15: {
            LogStep(15, "TH reads RxErrSecCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0035"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::RxErrSecCount::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "TH reads RxErrFcsCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0036"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::RxErrFcsCount::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "TH reads RxErrOtherCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0037"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::RxErrOtherCount::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGTHREAD_2_4Suite : public TestCommand
{
public:
    Test_TC_DGTHREAD_2_4Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_DGTHREAD_2_4", 3, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGTHREAD_2_4Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("overrunCount", value, 0ULL));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Sends ResetCounts command");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ThreadNetworkDiagnostics::Commands::ResetCounts::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                               ThreadNetworkDiagnostics::Commands::ResetCounts::Id, value, chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Read the Overruncount attribute");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::OverrunCount::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ULABEL_1_1Suite : public TestCommand
{
public:
    Test_TC_ULABEL_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ULABEL_1_1", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ULABEL_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UserLabel::Id, UserLabel::Attributes::ClusterRevision::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UserLabel::Id, UserLabel::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UserLabel::Id, UserLabel::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UserLabel::Id, UserLabel::Attributes::AcceptedCommandList::Id,
                                 true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UserLabel::Id, UserLabel::Attributes::GeneratedCommandList::Id,
                                 true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ULABEL_2_1Suite : public TestCommand
{
public:
    Test_TC_ULABEL_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ULABEL_2_1", 2, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ULABEL_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::UserLabel::Structs::LabelStruct::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH reads LabelList attribute of the DUT");
            VerifyOrDo(!ShouldSkip("ULABEL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UserLabel::Id, UserLabel::Attributes::LabelList::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ULABEL_2_2Suite : public TestCommand
{
public:
    Test_TC_ULABEL_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ULABEL_2_2", 3, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ULABEL_2_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::UserLabel::Structs::LabelStruct::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("labelList", iter_0, 0));
                    VerifyOrReturn(
                        CheckValueAsString("labelList[0].label", iter_0.GetValue().label, chip::CharSpan("roomName", 8)));
                    VerifyOrReturn(
                        CheckValueAsString("labelList[0].value", iter_0.GetValue().value, chip::CharSpan("master bedroom 1", 16)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("labelList", iter_0, 1));
                    VerifyOrReturn(
                        CheckValueAsString("labelList[1].label", iter_0.GetValue().label, chip::CharSpan("Orientation", 11)));
                    VerifyOrReturn(CheckValueAsString("labelList[1].value", iter_0.GetValue().value, chip::CharSpan("east", 4)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("labelList", iter_0, 2));
                    VerifyOrReturn(CheckValueAsString("labelList[2].label", iter_0.GetValue().label, chip::CharSpan("floor", 5)));
                    VerifyOrReturn(CheckValueAsString("labelList[2].value", iter_0.GetValue().value, chip::CharSpan("2", 1)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("labelList", iter_0, 3));
                    VerifyOrReturn(
                        CheckValueAsString("labelList[3].label", iter_0.GetValue().label, chip::CharSpan("roomType", 8)));
                    VerifyOrReturn(CheckValueAsString("labelList[3].value", iter_0.GetValue().value, chip::CharSpan("bedroom", 7)));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("labelList", iter_0, 4));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintMinLength("value", value, 4));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH writes LabelList attribute from the DUT");
            VerifyOrDo(!ShouldSkip("ULABEL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::UserLabel::Structs::LabelStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::UserLabel::Structs::LabelStruct::Type>(4);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].label = chip::Span<const char>("roomNamegarbage: not in length on purpose", 8);
                listHolder_0->mList[0].value = chip::Span<const char>("master bedroom 1garbage: not in length on purpose", 16);

                listHolder_0->mList[1].label = chip::Span<const char>("Orientationgarbage: not in length on purpose", 11);
                listHolder_0->mList[1].value = chip::Span<const char>("eastgarbage: not in length on purpose", 4);

                listHolder_0->mList[2].label = chip::Span<const char>("floorgarbage: not in length on purpose", 5);
                listHolder_0->mList[2].value = chip::Span<const char>("2garbage: not in length on purpose", 1);

                listHolder_0->mList[3].label = chip::Span<const char>("roomTypegarbage: not in length on purpose", 8);
                listHolder_0->mList[3].value = chip::Span<const char>("bedroomgarbage: not in length on purpose", 7);

                value =
                    chip::app::DataModel::List<chip::app::Clusters::UserLabel::Structs::LabelStruct::Type>(listHolder_0->mList, 4);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UserLabel::Id, UserLabel::Attributes::LabelList::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads LabelList attribute from the DUT");
            VerifyOrDo(!ShouldSkip("ULABEL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UserLabel::Id, UserLabel::Attributes::LabelList::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ULABEL_2_3Suite : public TestCommand
{
public:
    Test_TC_ULABEL_2_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ULABEL_2_3", 3, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ULABEL_2_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH writes LabelList attribute of the DUT");
            VerifyOrDo(!ShouldSkip("ULABEL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::UserLabel::Structs::LabelStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::UserLabel::Structs::LabelStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].label = chip::Span<const char>("roomgarbage: not in length on purpose", 4);
                listHolder_0->mList[0].value =
                    chip::Span<const char>("17_bytesIsTooLongforuserlabelnotexpectedgarbage: not in length on purpose", 40);

                value =
                    chip::app::DataModel::List<chip::app::Clusters::UserLabel::Structs::LabelStruct::Type>(listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UserLabel::Id, UserLabel::Attributes::LabelList::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH writes LabelList attribute of the DUT");
            VerifyOrDo(!ShouldSkip("ULABEL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::UserLabel::Structs::LabelStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::UserLabel::Structs::LabelStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].label =
                    chip::Span<const char>("17_bytesIsTooLongforuserlabelnotexpectedgarbage: not in length on purpose", 40);
                listHolder_0->mList[0].value = chip::Span<const char>("foobargarbage: not in length on purpose", 6);

                value =
                    chip::app::DataModel::List<chip::app::Clusters::UserLabel::Structs::LabelStruct::Type>(listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UserLabel::Id, UserLabel::Attributes::LabelList::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ULABEL_2_4Suite : public TestCommand
{
public:
    Test_TC_ULABEL_2_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ULABEL_2_4", 5, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ULABEL_2_4Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::UserLabel::Structs::LabelStruct::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("labelList", iter_0, 0));
                    VerifyOrReturn(CheckValueAsString("labelList[0].label", iter_0.GetValue().label, chip::CharSpan("room", 4)));
                    VerifyOrReturn(
                        CheckValueAsString("labelList[0].value", iter_0.GetValue().value, chip::CharSpan("bedroom 1", 9)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("labelList", iter_0, 1));
                    VerifyOrReturn(
                        CheckValueAsString("labelList[1].label", iter_0.GetValue().label, chip::CharSpan("Orientation", 11)));
                    VerifyOrReturn(CheckValueAsString("labelList[1].value", iter_0.GetValue().value, chip::CharSpan("east", 4)));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("labelList", iter_0, 2));
                }
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::UserLabel::Structs::LabelStruct::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("labelList", iter_0, 0));
                    VerifyOrReturn(CheckValueAsString("labelList[0].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckValueAsString("labelList[0].value", iter_0.GetValue().value, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("labelList", iter_0, 1));
                }
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH writes LabelList attribute of the DUT");
            VerifyOrDo(!ShouldSkip("ULABEL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::UserLabel::Structs::LabelStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::UserLabel::Structs::LabelStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].label = chip::Span<const char>("roomgarbage: not in length on purpose", 4);
                listHolder_0->mList[0].value = chip::Span<const char>("bedroom 1garbage: not in length on purpose", 9);

                listHolder_0->mList[1].label = chip::Span<const char>("Orientationgarbage: not in length on purpose", 11);
                listHolder_0->mList[1].value = chip::Span<const char>("eastgarbage: not in length on purpose", 4);

                value =
                    chip::app::DataModel::List<chip::app::Clusters::UserLabel::Structs::LabelStruct::Type>(listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UserLabel::Id, UserLabel::Attributes::LabelList::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads LabelList attribute of the DUT");
            VerifyOrDo(!ShouldSkip("ULABEL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UserLabel::Id, UserLabel::Attributes::LabelList::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH writes LabelList attribute of the DUT");
            VerifyOrDo(!ShouldSkip("ULABEL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::UserLabel::Structs::LabelStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::UserLabel::Structs::LabelStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].label = chip::Span<const char>("garbage: not in length on purpose", 0);
                listHolder_0->mList[0].value = chip::Span<const char>("garbage: not in length on purpose", 0);

                value =
                    chip::app::DataModel::List<chip::app::Clusters::UserLabel::Structs::LabelStruct::Type>(listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UserLabel::Id, UserLabel::Attributes::LabelList::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads LabelList attribute of the DUT");
            VerifyOrDo(!ShouldSkip("ULABEL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UserLabel::Id, UserLabel::Attributes::LabelList::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGWIFI_1_1Suite : public TestCommand
{
public:
    Test_TC_DGWIFI_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGWIFI_1_1", 12, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGWIFI_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 2UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 6UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 7UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 8UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 9UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 10UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 12UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 11UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH reads the ClusterRevision from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads the FeatureMap from DUT");
            VerifyOrDo(!ShouldSkip("( !DGWIFI.S.F00 && !DGWIFI.S.F01 )"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Given DGWIFI.S.F00(PacketCounts) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("DGWIFI.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Given DGWIFI.S.F01(ErrorCounts) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("DGWIFI.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads AttributeList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH reads Feature dependent(DGWIFI.S.F00) attributes in attributeList from DUT");
            VerifyOrDo(!ShouldSkip("DGWIFI.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH reads Feature dependent(DGWIFI.S.F01) attributes in attributeList from DUT");
            VerifyOrDo(!ShouldSkip("DGWIFI.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH reads optional attribute (CurrentMaxRate) in AttributeList from DUT");
            VerifyOrDo(!ShouldSkip("DGWIFI.S.A000b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "TH reads AcceptedCommandList from DUT");
            VerifyOrDo(!ShouldSkip(" !DGWIFI.S.F01 "), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "TH reads Feature dependent(DGWIFI.S.F01) command in AcceptedCommandList from DUT");
            VerifyOrDo(!ShouldSkip("DGWIFI.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "TH reads GeneratedCommandList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGWIFI_2_1Suite : public TestCommand
{
public:
    Test_TC_DGWIFI_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGWIFI_2_1", 14, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGWIFI_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::ByteSpan> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "octet_string", "octet_string"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::WiFiNetworkDiagnostics::SecurityType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::WiFiNetworkDiagnostics::WiFiVersionType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 5U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8s", "int8s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -120));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 0));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int64u", "int64u"));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int64u", "int64u"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH reads BSSID attribute from DUT");
            VerifyOrDo(!ShouldSkip("DGWIFI.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::Bssid::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Reads SecurityType attribute constraints");
            VerifyOrDo(!ShouldSkip("DGWIFI.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::SecurityType::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Reads WiFiVersion attribute constraints");
            VerifyOrDo(!ShouldSkip("DGWIFI.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::WiFiVersion::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Reads ChannelNumber attribute constraints");
            VerifyOrDo(!ShouldSkip("DGWIFI.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::ChannelNumber::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Reads RSSI attribute constraints");
            VerifyOrDo(!ShouldSkip("DGWIFI.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::Rssi::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Reads BeaconLostCount attribute constraints");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::BeaconLostCount::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Reads BeaconRxCount attribute constraints");
            VerifyOrDo(!ShouldSkip("DGWIFI.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::BeaconRxCount::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Reads PacketMulticastRxCount attribute constraints");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::PacketMulticastRxCount::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Reads PacketMulticastTxCount attribute constraints");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::PacketMulticastTxCount::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Reads PacketUnicastRxCount attribute constraints");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.A0009"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::PacketUnicastRxCount::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Reads PacketUnicastTxCount attribute constraints");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::PacketUnicastTxCount::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Reads CurrentMaxRate attribute constraints");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.A000b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::CurrentMaxRate::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Reads OverrunCount attribute constraints");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.A000c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::OverrunCount::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGWIFI_2_3Suite : public TestCommand
{
public:
    Test_TC_DGWIFI_2_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGWIFI_2_3", 8, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGWIFI_2_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH sends ResetCounts command to DUT");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WiFiNetworkDiagnostics::Commands::ResetCounts::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                               WiFiNetworkDiagnostics::Commands::ResetCounts::Id, value, chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Reads BeaconLostCount attribute from DUT");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.C00.Rsp && DGWIFI.S.A0005"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::BeaconLostCount::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Reads BeaconRxCount attribute from DUT");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.C00.Rsp && DGWIFI.S.A0006"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::BeaconRxCount::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Reads PacketMulticastRxCount attribute from DUT");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.C00.Rsp && DGWIFI.S.A0007"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::PacketMulticastRxCount::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Reads PacketMulticastTxCount attribute from DUT");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.C00.Rsp && DGWIFI.S.A0008"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::PacketMulticastTxCount::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Reads PacketUnicastRxCount attribute from DUT");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.C00.Rsp && DGWIFI.S.A0009"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::PacketUnicastRxCount::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Reads PacketUnicastTxCount attribute from DUT");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.C00.Rsp && DGWIFI.S.A000a"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::PacketUnicastTxCount::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_1_1Suite : public TestCommand
{
public:
    Test_TC_WNCV_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_WNCV_1_1", 19, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_WNCV_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 5U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 5U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 200U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 2UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 4UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 8UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 16UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 7UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 10UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 13UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 23UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 26UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 16UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 17UL));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 11UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 14UL));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 18UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 19UL));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 12UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 15UL));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 7UL));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 8UL));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH reads from the DUT the (0xFFFD) ClusterRevision attribute");
            VerifyOrDo(!ShouldSkip("WNCV.S.Afffd"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads from the DUT the (0xFFFC) FeatureMap attribute");
            VerifyOrDo(!ShouldSkip(" WNCV.S.Afffc && !WNCV.S.F00 && !WNCV.S.F01 && !WNCV.S.F02 && !WNCV.S.F03 && !WNCV.S.F04 "),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::FeatureMap::Id,
                                 true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Given WNCV.S.F00(LF) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::FeatureMap::Id,
                                 true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Given  WNCV.S.F01(TL) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::FeatureMap::Id,
                                 true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Given WNCV.S.F02(PA_LF) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("WNCV.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::FeatureMap::Id,
                                 true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Given WNCV.S.F03(ABS) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("WNCV.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::FeatureMap::Id,
                                 true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Given WNCV.S.F04(PA_TL) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("WNCV.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::FeatureMap::Id,
                                 true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH reads from the DUT the (0xFFFB) AttributeList attribute");
            VerifyOrDo(!ShouldSkip("WNCV.S.Afffb"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "TH reads optional attribute(SafetyStatus) in AttributeList");
            VerifyOrDo(!ShouldSkip("WNCV.S.Afffb && WNCV.S.A001a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Read the Feature dependent(WNCV.S.F00 & WNCV.S.F02 & WNCV.S.F03) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.F03 && WNCV.S.Afffb"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Read the Feature dependent(WNCV.S.F00 & WNCV.S.F02 ) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.Afffb"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Read the Feature dependent(WNCV.S.F01 & WNCV.S.F04 & WNCV.S.F03) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.F03 && WNCV.S.Afffb"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Read the Feature dependent(WNCV.S.F01 & WNCV.S.F04 ) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.Afffb"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "TH reads from the DUT the (0xFFF9) AcceptedCommandList attribute");
            VerifyOrDo(!ShouldSkip("WNCV.S.Afff9"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "TH reads Feature dependent(WNCV.S.F00 & WNCV.S.F02) command in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("WNCV.S.Afff9 && WNCV.S.F00 && WNCV.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "TH reads Feature dependent(WNCV.S.F01 & WNCV.S.F03) command in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("WNCV.S.Afff9 && WNCV.S.F01 && WNCV.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "TH reads Feature dependent(WNCV.S.F01 & WNCV.S.F04) command in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("WNCV.S.Afff9 && WNCV.S.F01 && WNCV.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "TH reads from the DUT the (0xFFF8) GeneratedCommandList attribute");
            VerifyOrDo(!ShouldSkip("WNCV.S.Afff8"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_2_1Suite : public TestCommand
{
public:
    Test_TC_WNCV_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_WNCV_2_1", 24, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_WNCV_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::WindowCovering::Type value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::ConfigStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 127U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 127U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::WindowCovering::EndProductType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 23U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::Mode> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 15U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 10000U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 10000U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 10000U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 10000U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::SafetyStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap16", "bitmap16"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2047U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent", "Percent"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 100U));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent", "Percent"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 100U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "1a: read the RO mandatory attribute default: Type");
            VerifyOrDo(!ShouldSkip("WNCV.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::Type::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "1b: read the RO mandatory attribute default: ConfigStatus");
            VerifyOrDo(!ShouldSkip("WNCV.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::ConfigStatus::Id,
                                 true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "1c: read the RO mandatory attribute default: OperationalStatus");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::OperationalStatus::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "1d: read the RO mandatory attribute default: EndProductType");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000d"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::EndProductType::Id,
                                 true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "1e: read the RW mandatory attribute default: Mode");
            VerifyOrDo(!ShouldSkip("WNCV.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::Mode::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "1f: write a value into the RW mandatory attribute:: Mode");
            VerifyOrDo(!ShouldSkip("WNCV.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::WindowCovering::Mode> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::WindowCovering::Mode>>(0U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::Mode::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "2a: read the RO optional attribute default: TargetPositionLiftPercent100ths");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::TargetPositionLiftPercent100ths::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "2b: read the RO optional attribute default: TargetPositionTiltPercent100ths");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::TargetPositionTiltPercent100ths::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "2c: read the RO optional attribute default: CurrentPositionLiftPercent100ths");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercent100ths::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "2d: read the RO optional attribute default: CurrentPositionTiltPercent100ths");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercent100ths::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "2e: read the RO optional attribute default: InstalledOpenLimitLift");
            VerifyOrDo(!ShouldSkip("WNCV.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::InstalledOpenLimitLift::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "2f: read the RO optional attribute default: InstalledClosedLimitLift");
            VerifyOrDo(!ShouldSkip("WNCV.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::InstalledClosedLimitLift::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "2g: read the RO optional attribute default: InstalledOpenLimitTilt");
            VerifyOrDo(!ShouldSkip("WNCV.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::InstalledOpenLimitTilt::Id, true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "2h: read the RO optional attribute default: InstalledClosedLimitTilt");
            VerifyOrDo(!ShouldSkip("WNCV.S.A0013"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::InstalledClosedLimitTilt::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "3a: read the RO mandatory attribute default: SafetyStatus");
            VerifyOrDo(!ShouldSkip("WNCV.S.A001a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::SafetyStatus::Id,
                                 true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "3b: read the RO optional attribute default: PhysicalClosedLimitLift");
            VerifyOrDo(!ShouldSkip("WNCV.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::PhysicalClosedLimitLift::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "3c: read the RO optional attribute default: PhysicalClosedLimitTilt");
            VerifyOrDo(!ShouldSkip("WNCV.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::PhysicalClosedLimitTilt::Id, true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "3d: read the RO optional attribute default: CurrentPositionLift");
            VerifyOrDo(!ShouldSkip("WNCV.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLift::Id, true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "3e: read the RO optional attribute default: CurrentPositionTilt");
            VerifyOrDo(!ShouldSkip("WNCV.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTilt::Id, true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "3f: read the RO optional attribute default: NumberOfActuationsLift");
            VerifyOrDo(!ShouldSkip("WNCV.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::NumberOfActuationsLift::Id, true, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "3g: read the RO optional attribute default: NumberOfActuationsTilt");
            VerifyOrDo(!ShouldSkip("WNCV.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::NumberOfActuationsTilt::Id, true, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "3h: read the RO optional attribute default: CurrentPositionLiftPercentage");
            VerifyOrDo(!ShouldSkip("WNCV.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercentage::Id, true, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "3i:read the RO optional attribute default: CurrentPositionTiltPercentage");
            VerifyOrDo(!ShouldSkip("WNCV.S.A0009"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercentage::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_2_2Suite : public TestCommand
{
public:
    Test_TC_WNCV_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_WNCV_2_2", 2, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_WNCV_2_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1,
                    "Reads ConfigStatus attribute from DUT, if (PA & LF) value of bit 3 must be 1b else 0b & if (PA & TL) value of "
                    "bit 4 must be 1b else 0b");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && WNCV.S.A0007 && WNCV.S.F00 && WNCV.S.F02"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_2_3Suite : public TestCommand
{
public:
    Test_TC_WNCV_2_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_WNCV_2_3", 18, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_WNCV_2_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::BitMask<chip::app::Clusters::WindowCovering::ConfigStatus> configStatusValA;
    chip::BitMask<chip::app::Clusters::WindowCovering::ConfigStatus> configStatusValB;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::ConfigStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 4U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 127U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::ConfigStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 127U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::ConfigStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 127U));
                configStatusValA = value;
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::ConfigStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 127U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::Mode> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 127U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_BUSY));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::ConfigStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 127U));
                configStatusValB = value;
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::ConfigStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 127U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "1a: TH set the Mode Attribute bit0 of the DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.M.Reversal && WNCV.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::WindowCovering::Mode> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::WindowCovering::Mode>>(1U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::Mode::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "1b: TH reads ConfigStatus attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.M.Reversal && WNCV.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::ConfigStatus::Id,
                                 true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "1c: TH clear the Mode Attribute bit0 of the DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.M.Reversal && WNCV.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::WindowCovering::Mode> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::WindowCovering::Mode>>(0U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::Mode::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "1d: TH reads ConfigStatus attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.M.Reversal && WNCV.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::ConfigStatus::Id,
                                 true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "2a: TH set the Mode Attribute bit1 of the DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.M.Calibration && WNCV.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::WindowCovering::Mode> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::WindowCovering::Mode>>(2U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::Mode::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "2b: TH reads ConfigStatus attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.M.Calibration && WNCV.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::ConfigStatus::Id,
                                 true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "2c: If (ConfigStatus bit0 == 0) TH send DownOrClose command to the DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.M.Calibration && WNCV.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::DownOrClose::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::DownOrClose::Id, value,
                               chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "2d: TH clear the Mode Attribute bit1 of the DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.M.Calibration && WNCV.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::WindowCovering::Mode> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::WindowCovering::Mode>>(0U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::Mode::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "2e: TH reads ConfigStatus attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.M.Calibration && WNCV.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::ConfigStatus::Id,
                                 true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "2f: TH reads the Mode Attribute from the DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.M.Calibration && WNCV.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::Mode::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "2g: TH send DownOrClose command to the DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.M.Calibration && WNCV.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::DownOrClose::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::DownOrClose::Id, value,
                               chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "3a: TH set the Mode Attribute bit2 of the DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.M.Maintenance && WNCV.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::WindowCovering::Mode> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::WindowCovering::Mode>>(4U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::Mode::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "3b: TH send DownOrClose command to the DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.M.Maintenance && WNCV.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::DownOrClose::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::DownOrClose::Id, value,
                               chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "3c: TH reads ConfigStatus attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.M.Maintenance && WNCV.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::ConfigStatus::Id,
                                 true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "3d: TH clear the Mode Attribute bit2 of the DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.M.Maintenance && WNCV.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::WindowCovering::Mode> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::WindowCovering::Mode>>(0U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::Mode::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "3e: TH send DownOrClose command to the DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.M.Maintenance && WNCV.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::DownOrClose::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::DownOrClose::Id, value,
                               chip::NullOptional

            );
        }
        case 17: {
            LogStep(17, "3f: TH reads ConfigStatus attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.M.Maintenance && WNCV.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::ConfigStatus::Id,
                                 true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_2_4Suite : public TestCommand
{
public:
    Test_TC_WNCV_2_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_WNCV_2_4", 2, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_WNCV_2_4Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Reads Type attribute from DUT");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && WNCV.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_2_5Suite : public TestCommand
{
public:
    Test_TC_WNCV_2_5Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_WNCV_2_5", 2, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_WNCV_2_5Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::WindowCovering::EndProductType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 23U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH reads EndProductType attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000d"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::EndProductType::Id,
                                 true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_3_1Suite : public TestCommand
{
public:
    Test_TC_WNCV_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_WNCV_3_1", 29, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_WNCV_3_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 10000U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent", "Percent"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 100U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 10000U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent", "Percent"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 100U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("targetPositionLiftPercent100ths", value));
                VerifyOrReturn(CheckValue("targetPositionLiftPercent100ths.Value()", value.Value(), 0U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("targetPositionTiltPercent100ths", value));
                VerifyOrReturn(CheckValue("targetPositionTiltPercent100ths.Value()", value.Value(), 0U));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1U));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 2U));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 4U));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 8U));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 4U));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 8U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 16U));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 32U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 16U));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 32U));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9999U));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent", "Percent"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 99U));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9999U));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent", "Percent"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 99U));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("operationalStatus", value, 0U));
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9999U));
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9999U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "0: Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "1a: TH sends DownOrClose command to preposition the DUT in the opposite direction");
            VerifyOrDo(!ShouldSkip("WNCV.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::DownOrClose::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::DownOrClose::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "1b: TH Waits for 10 seconds movement(s) on the device");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "1c: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercent100ths::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "1d: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercentage::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "1e: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercent100ths::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "1f: If (PA & TL) TH reads CurrentPositionTiltPercentage optional attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A0009"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercentage::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "2: Subscribe to DUT reports on OperationalStatus attribute");
            return SubscribeAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                      WindowCovering::Attributes::OperationalStatus::Id, 4, 5, true, chip::NullOptional,
                                      chip::NullOptional, /* autoResubscribe = */ chip::NullOptional);
        }
        case 8: {
            LogStep(8, "2a: TH sends UpOrOpen command to DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::UpOrOpen::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::UpOrOpen::Id, value,
                               chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "2b: DUT updates its attributes");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "2c: If (PA & LF) TH reads TargetPositionLiftPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::TargetPositionLiftPercent100ths::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "2d: If (PA & TL) TH reads TargetPositionTiltPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::TargetPositionTiltPercent100ths::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "2e: TH leave the device moving for 2 seconds");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 2000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "3a: TH reads OperationalStatus attribute's bit 0..1");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::OperationalStatus::Id, true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "3a: TH reads OperationalStatus attribute's bit 2..3 (WNCV.S.F00(LF))");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a && WNCV.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::OperationalStatus::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "3a: TH reads OperationalStatus attribute's bit 2..3 (WNCV.S.F00(LF))");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a && !WNCV.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::OperationalStatus::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "3a: TH reads OperationalStatus attribute's bit 4..5 (WNCV.S.F01(TL))");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a && WNCV.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::OperationalStatus::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "3a: TH reads OperationalStatus attribute's bit 4..5 (WNCV.S.F01(TL))");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a && !WNCV.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::OperationalStatus::Id, true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "3a2: DUT updates its attributes");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 3000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 19: {
            LogStep(19, "3b: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercent100ths::Id, true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "3c: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercentage::Id, true, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "3d: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercent100ths::Id, true, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "3e: If (PA & LF) TH reads CurrentPositionTiltPercentage optional attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A0009"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercentage::Id, true, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "4a: TH sends a StopMotion command to DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::StopMotion::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::StopMotion::Id, value,
                               chip::NullOptional

            );
        }
        case 24: {
            LogStep(24, "4b: TH waits for 3 seconds the end of inertial movement(s) on the device");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 3000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 25: {
            LogStep(25, "4c: Verify DUT update OperationalStatus attribute to TH after a StopMotion");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::OperationalStatus::Id, true, chip::NullOptional);
        }
        case 26: {
            LogStep(26, "5a: TH waits for x seconds attributes update on the device");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 27: {
            LogStep(27, "5b: If (PA & LF) TH reads TargetPositionLiftPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::TargetPositionLiftPercent100ths::Id, true, chip::NullOptional);
        }
        case 28: {
            LogStep(28, "5c: If (PA & TL) TH reads TargetPositionTiltPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::TargetPositionTiltPercent100ths::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_3_2Suite : public TestCommand
{
public:
    Test_TC_WNCV_3_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_WNCV_3_2", 29, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_WNCV_3_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9999U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent", "Percent"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 99U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9999U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent", "Percent"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 99U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("targetPositionLiftPercent100ths", value));
                VerifyOrReturn(CheckValue("targetPositionLiftPercent100ths.Value()", value.Value(), 10000U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("targetPositionTiltPercent100ths", value));
                VerifyOrReturn(CheckValue("targetPositionTiltPercent100ths.Value()", value.Value(), 10000U));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 2U));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 1U));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 8U));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 4U));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 4U));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 8U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 32U));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 16U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 16U));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 32U));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 10000U));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent", "Percent"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 100U));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 10000U));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent", "Percent"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 100U));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("operationalStatus", value, 0U));
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 10000U));
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 10000U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "0: Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "1a: TH sends UpOrOpen command to preposition the DUT in the opposite direction");
            VerifyOrDo(!ShouldSkip("WNCV.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::UpOrOpen::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::UpOrOpen::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "1b: TH Waits for 10 seconds movement(s) on the device");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "1c: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercent100ths::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "1d: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercentage::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "1e: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercent100ths::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "1f: If (PA & TL) TH reads CurrentPositionTiltPercentage optional attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A0009"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercentage::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "2: Subscribe to DUT reports on OperationalStatus attribute");
            return SubscribeAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                      WindowCovering::Attributes::OperationalStatus::Id, 4, 5, true, chip::NullOptional,
                                      chip::NullOptional, /* autoResubscribe = */ chip::NullOptional);
        }
        case 8: {
            LogStep(8, "2a: TH sends DownOrClose command to DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::DownOrClose::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::DownOrClose::Id, value,
                               chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "2b: DUT updates its attributes");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "2c: If (PA & LF) TH reads TargetPositionLiftPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::TargetPositionLiftPercent100ths::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "2d: If (PA & TL) TH reads TargetPositionTiltPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::TargetPositionTiltPercent100ths::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "2e: TH leave the device moving for 2 seconds");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 2000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "3a: TH reads OperationalStatus attribute's bit 0..1");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::OperationalStatus::Id, true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "3a: TH reads OperationalStatus attribute's bit 2..3 (WNCV.S.F00(LF))");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a && WNCV.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::OperationalStatus::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "3a: TH reads OperationalStatus attribute's bit 2..3 (WNCV.S.F00(LF))");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a && !WNCV.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::OperationalStatus::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "3a: TH reads OperationalStatus attribute's bit 4..5 (WNCV.S.F01(TL))");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a && WNCV.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::OperationalStatus::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "3a: TH reads OperationalStatus attribute's bit 4..5 (WNCV.S.F01(TL))");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a && !WNCV.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::OperationalStatus::Id, true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "3a2: DUT updates its attributes");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 3000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 19: {
            LogStep(19, "3b: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercent100ths::Id, true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "3c: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercentage::Id, true, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "3d: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercent100ths::Id, true, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "3e: If (PA & LF) TH reads CurrentPositionTiltPercentage optional attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A0009"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercentage::Id, true, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "4a: TH sends a StopMotion command to DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::StopMotion::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::StopMotion::Id, value,
                               chip::NullOptional

            );
        }
        case 24: {
            LogStep(24, "4b: TH waits for 3 seconds the end of inertial movement(s) on the device");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 3000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 25: {
            LogStep(25, "4c: Verify DUT update OperationalStatus attribute to TH after a StopMotion");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::OperationalStatus::Id, true, chip::NullOptional);
        }
        case 26: {
            LogStep(26, "5a: TH waits for x seconds attributes update on the device");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 27: {
            LogStep(27, "5b: If (PA & LF) TH reads TargetPositionLiftPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::TargetPositionLiftPercent100ths::Id, true, chip::NullOptional);
        }
        case 28: {
            LogStep(28, "5c: If (PA & TL) TH reads TargetPositionTiltPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::TargetPositionTiltPercent100ths::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_3_3Suite : public TestCommand
{
public:
    Test_TC_WNCV_3_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_WNCV_3_3", 17, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_WNCV_3_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::app::DataModel::Nullable<chip::Percent100ths> attrCurrentPositionLift;
    chip::app::DataModel::Nullable<chip::Percent100ths> attrCurrentPositionTilt;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, 0U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("operationalStatus", value, 0U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("operationalStatus", value, 0U));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 10000U));
                attrCurrentPositionLift = value;
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                if (attrCurrentPositionLift.IsNull())
                {
                    VerifyOrReturn(CheckValueNull("targetPositionLiftPercent100ths", value));
                }
                else
                {
                    VerifyOrReturn(CheckValueNonNull("targetPositionLiftPercent100ths", value));
                    VerifyOrReturn(
                        CheckValue("targetPositionLiftPercent100ths.Value()", value.Value(), attrCurrentPositionLift.Value()));
                }
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 10000U));
                attrCurrentPositionTilt = value;
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                if (attrCurrentPositionTilt.IsNull())
                {
                    VerifyOrReturn(CheckValueNull("targetPositionTiltPercent100ths", value));
                }
                else
                {
                    VerifyOrReturn(CheckValueNonNull("targetPositionTiltPercent100ths", value));
                    VerifyOrReturn(
                        CheckValue("targetPositionTiltPercent100ths.Value()", value.Value(), attrCurrentPositionTilt.Value()));
                }
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "0: Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "1a: TH sends DownOrClose command to preposition the DUT in the opposite direction");
            VerifyOrDo(!ShouldSkip("WNCV.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::DownOrClose::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::DownOrClose::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "1b: TH Waits for 6-8 seconds movement(s) on the device");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 6000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "1c: TH sends UpOrOpen command to preposition the DUT in the opposite direction");
            VerifyOrDo(!ShouldSkip("WNCV.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::UpOrOpen::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::UpOrOpen::Id, value,
                               chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "1d: TH Waits for 2 seconds movement(s) on the device");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 2000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "1e: TH reads OperationalStatus attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::OperationalStatus::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "1d: TH Waits for 2 seconds movement(s) on the device");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 2000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "2: Subscribe to DUT reports on OperationalStatus attribute");
            return SubscribeAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                      WindowCovering::Attributes::OperationalStatus::Id, 4, 5, true, chip::NullOptional,
                                      chip::NullOptional, /* autoResubscribe = */ chip::NullOptional);
        }
        case 8: {
            LogStep(8, "2a: TH sends a StopMotion command to DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::StopMotion::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::StopMotion::Id, value,
                               chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "2b: TH waits for 3 seconds the end of inertial movement(s) on the device");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 3000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "2c: TH reads OperationalStatus attribute from DUT after a StopMotion");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::OperationalStatus::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "2d: TH waits for 100ms - 3s attributes update on the device");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 2000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 12: {
            LogStep(12, "2e: TH reads OperationalStatus attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::OperationalStatus::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "3a: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercent100ths::Id, true, chip::NullOptional);
        }
        case 14: {
            LogStep(14,
                    "3b: If (PA & LF) TH reads TargetPositionLiftPercent100ths attribute 3c: it Must be equal with "
                    "CurrentPositionLiftPercent100ths from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000b && WNCV.S.A000e"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::TargetPositionLiftPercent100ths::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "4a: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercent100ths::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16,
                    "4b: If (PA & TL) TH reads TargetPositionTiltPercent100ths attribute 4c: it Must be equal with "
                    "CurrentPositionTiltPercent100ths from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000c && WNCV.S.A000f && PICS_SKIP_SAMPLE_APP"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::TargetPositionTiltPercent100ths::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_3_4Suite : public TestCommand
{
public:
    Test_TC_WNCV_3_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_WNCV_3_4", 10, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("fastMotionDuration", 0, UINT16_MAX, &mFastMotionDuration);
        AddArgument("fullMotionDuration", 0, UINT16_MAX, &mFullMotionDuration);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_WNCV_3_4Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mFastMotionDuration;
    chip::Optional<uint16_t> mFullMotionDuration;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("operationalStatus", value, 0U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentPositionLiftPercent100ths", value));
                VerifyOrReturn(CheckValue("currentPositionLiftPercent100ths.Value()", value.Value(), 0U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentPositionLiftPercentage", value));
                VerifyOrReturn(CheckValue("currentPositionLiftPercentage.Value()", value.Value(), 0U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentPositionTiltPercent100ths", value));
                VerifyOrReturn(CheckValue("currentPositionTiltPercent100ths.Value()", value.Value(), 0U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentPositionTiltPercentage", value));
                VerifyOrReturn(CheckValue("currentPositionTiltPercentage.Value()", value.Value(), 0U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "0: Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "1a: TH sends DownOrClose command to preposition the DUT in the opposite direction");
            VerifyOrDo(!ShouldSkip("WNCV.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::DownOrClose::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::DownOrClose::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "1b: TH Waits for fastMotionDuration seconds movement(s) on the device");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = mFastMotionDuration.HasValue() ? mFastMotionDuration.Value() : 3000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "2a: TH sends UpOrOpen command to DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::UpOrOpen::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::UpOrOpen::Id, value,
                               chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "2b: TH Waits for fullMotionDuration seconds movement(s) on the device");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = mFullMotionDuration.HasValue() ? mFullMotionDuration.Value() : 6000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "2c: TH reads OperationalStatus attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::OperationalStatus::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "3a: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercent100ths::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "3b: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercentage::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "3c: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercent100ths::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "3d: If (PA & TL) TH reads CurrentPositionTiltPercentage optional attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A0009"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercentage::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_3_5Suite : public TestCommand
{
public:
    Test_TC_WNCV_3_5Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_WNCV_3_5", 10, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("fastMotionDuration", 0, UINT16_MAX, &mFastMotionDuration);
        AddArgument("fullMotionDuration", 0, UINT16_MAX, &mFullMotionDuration);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_WNCV_3_5Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mFastMotionDuration;
    chip::Optional<uint16_t> mFullMotionDuration;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("operationalStatus", value, 0U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentPositionLiftPercent100ths", value));
                VerifyOrReturn(CheckValue("currentPositionLiftPercent100ths.Value()", value.Value(), 10000U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentPositionLiftPercentage", value));
                VerifyOrReturn(CheckValue("currentPositionLiftPercentage.Value()", value.Value(), 100U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentPositionTiltPercent100ths", value));
                VerifyOrReturn(CheckValue("currentPositionTiltPercent100ths.Value()", value.Value(), 10000U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentPositionTiltPercentage", value));
                VerifyOrReturn(CheckValue("currentPositionTiltPercentage.Value()", value.Value(), 100U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "0: Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "1a: TH sends UpOrOpen command to preposition the DUT in the opposite direction");
            VerifyOrDo(!ShouldSkip("WNCV.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::UpOrOpen::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::UpOrOpen::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "1b: TH Waits for fastMotionDuration seconds movement(s) on the device");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = mFastMotionDuration.HasValue() ? mFastMotionDuration.Value() : 3000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "2a: TH sends DownOrClose command to DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::DownOrClose::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::DownOrClose::Id, value,
                               chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "2b: TH Waits for fullMotionDuration seconds movement(s) on the device");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = mFullMotionDuration.HasValue() ? mFullMotionDuration.Value() : 6000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "2c: TH reads OperationalStatus attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::OperationalStatus::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "3a: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercent100ths::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "3b: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercentage::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "3c: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercent100ths::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "3d: If (PA & TL) TH reads CurrentPositionTiltPercentage optional attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A0009"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercentage::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_4_1Suite : public TestCommand
{
public:
    Test_TC_WNCV_4_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_WNCV_4_1", 18, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("fullMotionDuration", 0, UINT16_MAX, &mFullMotionDuration);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_WNCV_4_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mFullMotionDuration;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, 0U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("targetPositionLiftPercent100ths", value));
                VerifyOrReturn(CheckValue("targetPositionLiftPercent100ths.Value()", value.Value(), 2500U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("operationalStatus", value, 0U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentPositionLiftPercent100ths", value));
                VerifyOrReturn(CheckValue("currentPositionLiftPercent100ths.Value()", value.Value(), 2500U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentPositionLiftPercentage", value));
                VerifyOrReturn(CheckValue("currentPositionLiftPercentage.Value()", value.Value(), 25U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("targetPositionLiftPercent100ths", value));
                VerifyOrReturn(CheckValue("targetPositionLiftPercent100ths.Value()", value.Value(), 7520U));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("operationalStatus", value, 0U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentPositionLiftPercent100ths", value));
                VerifyOrReturn(CheckValue("currentPositionLiftPercent100ths.Value()", value.Value(), 7520U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentPositionLiftPercentage", value));
                VerifyOrReturn(CheckValue("currentPositionLiftPercentage.Value()", value.Value(), 75U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "0: Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "1a: TH sends DownOrClose command to preposition the DUT in the opposite direction");
            VerifyOrDo(!ShouldSkip("WNCV.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::DownOrClose::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::DownOrClose::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "1b: TH waits for x seconds movement(s) on the DUT");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = mFullMotionDuration.HasValue() ? mFullMotionDuration.Value() : 6000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "1c: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercent100ths::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "2a: TH sends GoToLiftPercentage command with 25 percent to DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.C05.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::GoToLiftPercentage::Type value;
            value.liftPercent100thsValue = 2500U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::GoToLiftPercentage::Id,
                               value, chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "2b: DUT updates its attributes");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6, "2c: If (PA & LF) TH reads TargetPositionLiftPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::TargetPositionLiftPercent100ths::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "3a: TH set a timeout of X minutes for failure");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = mFullMotionDuration.HasValue() ? mFullMotionDuration.Value() : 6000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 8: {
            LogStep(8, "3b: TH reads OperationalStatus attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::OperationalStatus::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "3c: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercent100ths::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "3d: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercentage::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "4a: TH sends GoToLiftPercentage command with 75.20 percent to DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.C05.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::GoToLiftPercentage::Type value;
            value.liftPercent100thsValue = 7520U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::GoToLiftPercentage::Id,
                               value, chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "4b: DUT updates its attributes");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "4c: If (PA & LF) TH reads TargetPositionLiftPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::TargetPositionLiftPercent100ths::Id, true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "5a: TH waits for x seconds movement(s) on the DUT");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = mFullMotionDuration.HasValue() ? mFullMotionDuration.Value() : 6000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 15: {
            LogStep(15, "5b: TH reads OperationalStatus attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::OperationalStatus::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "5c: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercent100ths::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "5d: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercentage::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_4_2Suite : public TestCommand
{
public:
    Test_TC_WNCV_4_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_WNCV_4_2", 18, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("fullMotionDuration", 0, UINT16_MAX, &mFullMotionDuration);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_WNCV_4_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mFullMotionDuration;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, 0U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("targetPositionTiltPercent100ths", value));
                VerifyOrReturn(CheckValue("targetPositionTiltPercent100ths.Value()", value.Value(), 3000U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("operationalStatus", value, 0U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentPositionTiltPercent100ths", value));
                VerifyOrReturn(CheckValue("currentPositionTiltPercent100ths.Value()", value.Value(), 3000U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentPositionTiltPercentage", value));
                VerifyOrReturn(CheckValue("currentPositionTiltPercentage.Value()", value.Value(), 30U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("targetPositionTiltPercent100ths", value));
                VerifyOrReturn(CheckValue("targetPositionTiltPercent100ths.Value()", value.Value(), 6005U));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("operationalStatus", value, 0U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentPositionTiltPercent100ths", value));
                VerifyOrReturn(CheckValue("currentPositionTiltPercent100ths.Value()", value.Value(), 6005U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentPositionTiltPercentage", value));
                VerifyOrReturn(CheckValue("currentPositionTiltPercentage.Value()", value.Value(), 60U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "0: Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "1a: TH sends DownOrClose command to preposition the DUT in the opposite direction");
            VerifyOrDo(!ShouldSkip("WNCV.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::DownOrClose::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::DownOrClose::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "1b: TH waits for x seconds movement(s) on the DUT");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = mFullMotionDuration.HasValue() ? mFullMotionDuration.Value() : 6000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "1c: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercent100ths::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "2a: TH sends GoToTiltPercentage command with 30 percent to DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.C08.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::GoToTiltPercentage::Type value;
            value.tiltPercent100thsValue = 3000U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::GoToTiltPercentage::Id,
                               value, chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "2b: DUT updates its attributes");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6, "2c: If (PA & TL) TH reads TargetPositionTiltPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::TargetPositionTiltPercent100ths::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "3a: TH set a timeout of X minutes for failure");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = mFullMotionDuration.HasValue() ? mFullMotionDuration.Value() : 6000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 8: {
            LogStep(8, "3b: TH reads OperationalStatus attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::OperationalStatus::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "3c: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercent100ths::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "3d: If (PA & TL) TH reads CurrentPositionTiltPercentage optional attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A0009"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercentage::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "4a: TH sends GoToTiltPercentage command with 60.05 percent to DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.C08.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::GoToTiltPercentage::Type value;
            value.tiltPercent100thsValue = 6005U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::GoToTiltPercentage::Id,
                               value, chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "4b: DUT updates its attributes");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "4c: If (PA & TL) TH reads TargetPositionTiltPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::TargetPositionTiltPercent100ths::Id, true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "5a: TH waits for x seconds movement(s) on the DUT");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = mFullMotionDuration.HasValue() ? mFullMotionDuration.Value() : 6000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 15: {
            LogStep(15, "5b: TH reads OperationalStatus attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::OperationalStatus::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "5c: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercent100ths::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "5d: If (PA & TL) TH reads CurrentPositionTiltPercentage optional attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A0009"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercentage::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_4_3Suite : public TestCommand
{
public:
    Test_TC_WNCV_4_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_WNCV_4_3", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_WNCV_4_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::app::DataModel::Nullable<chip::Percent100ths> attrCurrentPositionLiftPercent100ths;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 10000U));
                attrCurrentPositionLiftPercent100ths = value;
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentPositionLiftPercentage", value));
                VerifyOrReturn(CheckValue("currentPositionLiftPercentage.Value()", value.Value(),
                                          static_cast<uint8_t>(attrCurrentPositionLiftPercent100ths.Value() / 100)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 100U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "0: Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "1a: If (PA_LF & LF) TH reads CurrentPositionLiftPercent100ths from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercent100ths::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2,
                    "1b 1c: If (PA_LF & LF) TH reads CurrentPositionLiftPercentage from DUT + assert "
                    "CurrentPositionLiftPercent100ths/100 equals CurrentPositionLiftPercentage");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A0008 && WNCV.S.A000e"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercentage::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "2b: TH sends GoToLiftPercentage command with BadParam to DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 || WNCV.S.F00 && WNCV.S.C05.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::GoToLiftPercentage::Type value;
            value.liftPercent100thsValue = 12288U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::GoToLiftPercentage::Id,
                               value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "3a: TH sends GoToLiftPercentage command with 10001 to DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 || WNCV.S.F00 && WNCV.S.C05.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::GoToLiftPercentage::Type value;
            value.liftPercent100thsValue = 10001U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::GoToLiftPercentage::Id,
                               value, chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "4a: TH sends GoToLiftPercentage command with 0xFFFF to DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 || WNCV.S.F00 && WNCV.S.C05.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::GoToLiftPercentage::Type value;
            value.liftPercent100thsValue = 65535U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::GoToLiftPercentage::Id,
                               value, chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_4_4Suite : public TestCommand
{
public:
    Test_TC_WNCV_4_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_WNCV_4_4", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_WNCV_4_4Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::app::DataModel::Nullable<chip::Percent100ths> attrCurrentPositionTiltPercent100ths;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 10000U));
                attrCurrentPositionTiltPercent100ths = value;
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentPositionTiltPercentage", value));
                VerifyOrReturn(CheckValue("currentPositionTiltPercentage.Value()", value.Value(),
                                          static_cast<uint8_t>(attrCurrentPositionTiltPercent100ths.Value() / 100)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 100U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "0: Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "1a: If (PA_TL & TL) TH reads CurrentPositionTiltPercent100ths from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercent100ths::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2,
                    "1b 1c: If (PA_LF & LF) TH reads CurrentPositionTiltPercentage from DUT + assert "
                    "CurrentPositionTiltPercent100ths/100 equals CurrentPositionTiltPercentage");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f && WNCV.S.A0009"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercentage::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "2b: TH sends GoToTiltPercentage command with BadParam to DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 || WNCV.S.F01 && WNCV.S.C08.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::GoToTiltPercentage::Type value;
            value.tiltPercent100thsValue = 12288U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::GoToTiltPercentage::Id,
                               value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "3a: TH sends GoToTiltPercentage command with 10001 to DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 || WNCV.S.F01 && WNCV.S.C08.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::GoToTiltPercentage::Type value;
            value.tiltPercent100thsValue = 10001U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::GoToTiltPercentage::Id,
                               value, chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "4a: TH sends GoToTiltPercentage command with 0xFFFF to DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 || WNCV.S.F01 && WNCV.S.C08.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::GoToTiltPercentage::Type value;
            value.tiltPercent100thsValue = 65535U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::GoToTiltPercentage::Id,
                               value, chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_4_5Suite : public TestCommand
{
public:
    Test_TC_WNCV_4_5Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_WNCV_4_5", 17, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_WNCV_4_5Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::app::DataModel::Nullable<chip::Percent100ths> attrCurrentPositionLiftPercent100ths;
    chip::app::DataModel::Nullable<chip::Percent100ths> attrCurrentPositionTiltPercent100ths;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, 0U));
                attrCurrentPositionLiftPercent100ths = value;
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, 0U));
                attrCurrentPositionTiltPercent100ths = value;
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                if (attrCurrentPositionLiftPercent100ths.IsNull())
                {
                    VerifyOrReturn(CheckValueNull("currentPositionLiftPercent100ths", value));
                }
                else
                {
                    VerifyOrReturn(CheckValueNonNull("currentPositionLiftPercent100ths", value));
                    VerifyOrReturn(CheckValue("currentPositionLiftPercent100ths.Value()", value.Value(),
                                              attrCurrentPositionLiftPercent100ths.Value()));
                }
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                if (attrCurrentPositionTiltPercent100ths.IsNull())
                {
                    VerifyOrReturn(CheckValueNull("currentPositionTiltPercent100ths", value));
                }
                else
                {
                    VerifyOrReturn(CheckValueNonNull("currentPositionTiltPercent100ths", value));
                    VerifyOrReturn(CheckValue("currentPositionTiltPercent100ths.Value()", value.Value(),
                                              attrCurrentPositionTiltPercent100ths.Value()));
                }
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "0a: Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "0b: TH sends UpOrOpen command to preposition the DUT");
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::UpOrOpen::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::UpOrOpen::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "1a: If (PA_LF & LF) TH sends GoToLiftPercentage command with 90%% to DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.C05.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::GoToLiftPercentage::Type value;
            value.liftPercent100thsValue = 9000U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::GoToLiftPercentage::Id,
                               value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "1b: TH Waits for 100ms-1s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 4: {
            LogStep(4, "1c: TH sends StopMotion command to DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::StopMotion::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::StopMotion::Id, value,
                               chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "1d: TH Waits for 100ms-1s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 500UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6, "2a: If (PA_TL & TL) TH sends GoToTiltPercentage command with 90%% to DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.C08.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::GoToTiltPercentage::Type value;
            value.tiltPercent100thsValue = 9000U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::GoToTiltPercentage::Id,
                               value, chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "2b: TH Waits for 100ms-1s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 8: {
            LogStep(8, "2c: TH sends StopMotion command to DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::StopMotion::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::StopMotion::Id, value,
                               chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "2d: TH Waits for 100ms-1s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 500UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "3a: TH reads CurrentPositionLiftPercent100ths from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercent100ths::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "3b: TH reads CurrentPositionTiltPercent100ths from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercent100ths::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "3c: reboot/restart the DUT");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
            return Reboot(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "Reboot target device(DUT)");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Please reboot the DUT and enter 'y' after DUT startsgarbage: not in length on purpose", 52);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14, "3d: Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 15: {
            LogStep(15, "3e: TH reads CurrentPositionLiftPercent100ths from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercent100ths::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "3f: TH reads CurrentPositionTiltPercent100ths from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercent100ths::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TV_TargetNavigatorClusterSuite : public TestCommand
{
public:
    TV_TargetNavigatorClusterSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TV_TargetNavigatorCluster", 4, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TV_TargetNavigatorClusterSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::TargetNavigator::Structs::TargetInfo::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("targetList", iter_0, 0));
                    VerifyOrReturn(CheckValue("targetList[0].identifier", iter_0.GetValue().identifier, 1U));
                    VerifyOrReturn(
                        CheckValueAsString("targetList[0].name", iter_0.GetValue().name, chip::CharSpan("exampleName", 11)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("targetList", iter_0, 1));
                    VerifyOrReturn(CheckValue("targetList[1].identifier", iter_0.GetValue().identifier, 2U));
                    VerifyOrReturn(
                        CheckValueAsString("targetList[1].name", iter_0.GetValue().name, chip::CharSpan("exampleName", 11)));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("targetList", iter_0, 2));
                }
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentTarget", value, 0U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::TargetNavigator::Commands::NavigateTargetResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("data", value.data));
                VerifyOrReturn(CheckValueAsString("data.Value()", value.data.Value(), chip::CharSpan("data response", 13)));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read attribute Target Navigator list");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TargetNavigator::Id, TargetNavigator::Attributes::TargetList::Id,
                                 true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read attribute current navigator target");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TargetNavigator::Id,
                                 TargetNavigator::Attributes::CurrentTarget::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Navigate Target Request Command");
            ListFreer listFreer;
            chip::app::Clusters::TargetNavigator::Commands::NavigateTarget::Type value;
            value.target = 1U;
            value.data.Emplace();
            value.data.Value() = chip::Span<const char>("1garbage: not in length on purpose", 1);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), TargetNavigator::Id, TargetNavigator::Commands::NavigateTarget::Id,
                               value, chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TV_AudioOutputClusterSuite : public TestCommand
{
public:
    TV_AudioOutputClusterSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TV_AudioOutputCluster", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TV_AudioOutputClusterSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::AudioOutput::Structs::OutputInfo::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("outputList", iter_0, 0));
                    VerifyOrReturn(CheckValue("outputList[0].index", iter_0.GetValue().index, 1U));
                    VerifyOrReturn(CheckValue("outputList[0].outputType", iter_0.GetValue().outputType, 0U));
                    VerifyOrReturn(CheckValueAsString("outputList[0].name", iter_0.GetValue().name, chip::CharSpan("HDMI", 4)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("outputList", iter_0, 1));
                    VerifyOrReturn(CheckValue("outputList[1].index", iter_0.GetValue().index, 2U));
                    VerifyOrReturn(CheckValue("outputList[1].outputType", iter_0.GetValue().outputType, 0U));
                    VerifyOrReturn(CheckValueAsString("outputList[1].name", iter_0.GetValue().name, chip::CharSpan("HDMI", 4)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("outputList", iter_0, 2));
                    VerifyOrReturn(CheckValue("outputList[2].index", iter_0.GetValue().index, 3U));
                    VerifyOrReturn(CheckValue("outputList[2].outputType", iter_0.GetValue().outputType, 0U));
                    VerifyOrReturn(CheckValueAsString("outputList[2].name", iter_0.GetValue().name, chip::CharSpan("HDMI", 4)));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("outputList", iter_0, 3));
                }
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentOutput", value, 1U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::AudioOutput::Structs::OutputInfo::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("outputList", iter_0, 0));
                    VerifyOrReturn(CheckValue("outputList[0].index", iter_0.GetValue().index, 1U));
                    VerifyOrReturn(CheckValue("outputList[0].outputType", iter_0.GetValue().outputType, 0U));
                    VerifyOrReturn(
                        CheckValueAsString("outputList[0].name", iter_0.GetValue().name, chip::CharSpan("HDMI Test", 9)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("outputList", iter_0, 1));
                    VerifyOrReturn(CheckValue("outputList[1].index", iter_0.GetValue().index, 2U));
                    VerifyOrReturn(CheckValue("outputList[1].outputType", iter_0.GetValue().outputType, 0U));
                    VerifyOrReturn(CheckValueAsString("outputList[1].name", iter_0.GetValue().name, chip::CharSpan("HDMI", 4)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("outputList", iter_0, 2));
                    VerifyOrReturn(CheckValue("outputList[2].index", iter_0.GetValue().index, 3U));
                    VerifyOrReturn(CheckValue("outputList[2].outputType", iter_0.GetValue().outputType, 0U));
                    VerifyOrReturn(CheckValueAsString("outputList[2].name", iter_0.GetValue().name, chip::CharSpan("HDMI", 4)));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("outputList", iter_0, 3));
                }
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read attribute Audio Output list");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), AudioOutput::Id, AudioOutput::Attributes::OutputList::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read attribute current audio output");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), AudioOutput::Id, AudioOutput::Attributes::CurrentOutput::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Select Output Command");
            ListFreer listFreer;
            chip::app::Clusters::AudioOutput::Commands::SelectOutput::Type value;
            value.index = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), AudioOutput::Id, AudioOutput::Commands::SelectOutput::Id, value,
                               chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Rename Output Command");
            ListFreer listFreer;
            chip::app::Clusters::AudioOutput::Commands::RenameOutput::Type value;
            value.index = 1U;
            value.name  = chip::Span<const char>("HDMI Testgarbage: not in length on purpose", 9);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), AudioOutput::Id, AudioOutput::Commands::RenameOutput::Id, value,
                               chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "Read attribute Audio Output list");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), AudioOutput::Id, AudioOutput::Attributes::OutputList::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TV_ApplicationLauncherClusterSuite : public TestCommand
{
public:
    TV_ApplicationLauncherClusterSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TV_ApplicationLauncherCluster", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TV_ApplicationLauncherClusterSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("catalogList", iter_0, 0));
                    VerifyOrReturn(CheckValue("catalogList[0]", iter_0.GetValue(), 123U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("catalogList", iter_0, 1));
                    VerifyOrReturn(CheckValue("catalogList[1]", iter_0.GetValue(), 456U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("catalogList", iter_0, 2));
                }
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::ApplicationLauncher::Structs::ApplicationEP::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("currentApp", value));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::ApplicationLauncher::Commands::LauncherResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValueAsString("data", value.data, chip::ByteSpan(chip::Uint8::from_const_char("data"), 4)));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::ApplicationLauncher::Commands::LauncherResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValueAsString("data", value.data, chip::ByteSpan(chip::Uint8::from_const_char("data"), 4)));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::ApplicationLauncher::Commands::LauncherResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValueAsString("data", value.data, chip::ByteSpan(chip::Uint8::from_const_char("data"), 4)));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read attribute Application Launcher list");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ApplicationLauncher::Id,
                                 ApplicationLauncher::Attributes::CatalogList::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read attribute application launcher app");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ApplicationLauncher::Id,
                                 ApplicationLauncher::Attributes::CurrentApp::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Launch App Command");
            ListFreer listFreer;
            chip::app::Clusters::ApplicationLauncher::Commands::LaunchApp::Type value;

            value.application.catalogVendorId = 123U;
            value.application.applicationId   = chip::Span<const char>("applicationIdgarbage: not in length on purpose", 13);

            value.data.Emplace();
            value.data.Value() = chip::ByteSpan(chip::Uint8::from_const_char("datagarbage: not in length on purpose"), 4);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ApplicationLauncher::Id,
                               ApplicationLauncher::Commands::LaunchApp::Id, value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Stop App Command");
            ListFreer listFreer;
            chip::app::Clusters::ApplicationLauncher::Commands::StopApp::Type value;

            value.application.catalogVendorId = 123U;
            value.application.applicationId   = chip::Span<const char>("applicationIdgarbage: not in length on purpose", 13);

            return SendCommand(kIdentityAlpha, GetEndpoint(1), ApplicationLauncher::Id, ApplicationLauncher::Commands::StopApp::Id,
                               value, chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "Hide App Command");
            ListFreer listFreer;
            chip::app::Clusters::ApplicationLauncher::Commands::HideApp::Type value;

            value.application.catalogVendorId = 123U;
            value.application.applicationId   = chip::Span<const char>("applicationIdgarbage: not in length on purpose", 13);

            return SendCommand(kIdentityAlpha, GetEndpoint(1), ApplicationLauncher::Id, ApplicationLauncher::Commands::HideApp::Id,
                               value, chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TV_KeypadInputClusterSuite : public TestCommand
{
public:
    TV_KeypadInputClusterSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TV_KeypadInputCluster", 2, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TV_KeypadInputClusterSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::KeypadInput::Commands::SendKeyResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Send Key Command");
            ListFreer listFreer;
            chip::app::Clusters::KeypadInput::Commands::SendKey::Type value;
            value.keyCode = static_cast<chip::app::Clusters::KeypadInput::CecKeyCode>(3);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), KeypadInput::Id, KeypadInput::Commands::SendKey::Id, value,
                               chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TV_AccountLoginClusterSuite : public TestCommand
{
public:
    TV_AccountLoginClusterSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TV_AccountLoginCluster", 4, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TV_AccountLoginClusterSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::AccountLogin::Commands::GetSetupPINResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("setupPIN", value.setupPIN, chip::CharSpan("tempPin123", 10)));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Get Setup PIN Command");
            ListFreer listFreer;
            chip::app::Clusters::AccountLogin::Commands::GetSetupPIN::Type value;
            value.tempAccountIdentifier = chip::Span<const char>("asdfgarbage: not in length on purpose", 4);
            return SendCommand(kIdentityAlpha, GetEndpoint(3), AccountLogin::Id, AccountLogin::Commands::GetSetupPIN::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Login Command");
            ListFreer listFreer;
            chip::app::Clusters::AccountLogin::Commands::Login::Type value;
            value.tempAccountIdentifier = chip::Span<const char>("asdfgarbage: not in length on purpose", 4);
            value.setupPIN              = chip::Span<const char>("tempPin123garbage: not in length on purpose", 10);
            return SendCommand(kIdentityAlpha, GetEndpoint(3), AccountLogin::Id, AccountLogin::Commands::Login::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "Logout Command");
            ListFreer listFreer;
            chip::app::Clusters::AccountLogin::Commands::Logout::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(3), AccountLogin::Id, AccountLogin::Commands::Logout::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TV_WakeOnLanClusterSuite : public TestCommand
{
public:
    TV_WakeOnLanClusterSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TV_WakeOnLanCluster", 2, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TV_WakeOnLanClusterSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("MACAddress", value, chip::CharSpan("00:00:00:00:00", 14)));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read mac address");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WakeOnLan::Id, WakeOnLan::Attributes::MACAddress::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TV_ApplicationBasicClusterSuite : public TestCommand
{
public:
    TV_ApplicationBasicClusterSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TV_ApplicationBasicCluster", 9, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TV_ApplicationBasicClusterSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("vendorName", value, chip::CharSpan("exampleVendorName1", 18)));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::VendorId value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("vendorID", value, 1U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("applicationName", value, chip::CharSpan("exampleName1", 12)));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("productID", value, 1U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::ApplicationBasic::ApplicationStatusEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value, 0U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::ApplicationBasic::Structs::ApplicationBasicApplication::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("application.catalogVendorId", value.catalogVendorId, 123U));
                VerifyOrReturn(
                    CheckValueAsString("application.applicationId", value.applicationId, chip::CharSpan("applicationId", 13)));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("applicationVersion", value, chip::CharSpan("exampleVersion", 14)));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::VendorId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("allowedVendorList", iter_0, 0));
                    VerifyOrReturn(CheckValue("allowedVendorList[0]", iter_0.GetValue(), 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("allowedVendorList", iter_0, 1));
                    VerifyOrReturn(CheckValue("allowedVendorList[1]", iter_0.GetValue(), 456U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("allowedVendorList", iter_0, 2));
                }
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read attribute vendor name");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id, ApplicationBasic::Attributes::VendorName::Id,
                                 true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read attribute vendor id");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id, ApplicationBasic::Attributes::VendorID::Id,
                                 true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read attribute application name");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id,
                                 ApplicationBasic::Attributes::ApplicationName::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read attribute product id");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id, ApplicationBasic::Attributes::ProductID::Id,
                                 true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read attribute application status");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id, ApplicationBasic::Attributes::Status::Id,
                                 true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read attribute application status");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id,
                                 ApplicationBasic::Attributes::Application::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read attribute application version");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id,
                                 ApplicationBasic::Attributes::ApplicationVersion::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read attribute application allowed vendor list");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id,
                                 ApplicationBasic::Attributes::AllowedVendorList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TV_MediaPlaybackClusterSuite : public TestCommand
{
public:
    TV_MediaPlaybackClusterSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TV_MediaPlaybackCluster", 22, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TV_MediaPlaybackClusterSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::PlaybackStateEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentState", value, 0U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("startTime", value));
                VerifyOrReturn(CheckValue("startTime.Value()", value.Value(), 0ULL));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("duration", value));
                VerifyOrReturn(CheckValue("duration.Value()", value.Value(), 80000ULL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::MediaPlayback::Structs::PlaybackPosition::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("sampledPosition", value));
                VerifyOrReturn(CheckValue("sampledPosition.Value().updatedAt", value.Value().updatedAt, 0ULL));
                VerifyOrReturn(CheckValueNonNull("sampledPosition.Value().position", value.Value().position));
                VerifyOrReturn(CheckValue("sampledPosition.Value().position.Value()", value.Value().position.Value(), 0ULL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                float value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("playbackSpeed", value, 0.0f));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("seekRangeEnd", value));
                VerifyOrReturn(CheckValue("seekRangeEnd.Value()", value.Value(), 80000ULL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("seekRangeStart", value));
                VerifyOrReturn(CheckValue("seekRangeStart.Value()", value.Value(), 0ULL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("data", value.data));
                VerifyOrReturn(CheckValueAsString("data.Value()", value.data.Value(), chip::CharSpan("data response", 13)));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("data", value.data));
                VerifyOrReturn(CheckValueAsString("data.Value()", value.data.Value(), chip::CharSpan("data response", 13)));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("data", value.data));
                VerifyOrReturn(CheckValueAsString("data.Value()", value.data.Value(), chip::CharSpan("data response", 13)));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("data", value.data));
                VerifyOrReturn(CheckValueAsString("data.Value()", value.data.Value(), chip::CharSpan("data response", 13)));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("data", value.data));
                VerifyOrReturn(CheckValueAsString("data.Value()", value.data.Value(), chip::CharSpan("data response", 13)));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("data", value.data));
                VerifyOrReturn(CheckValueAsString("data.Value()", value.data.Value(), chip::CharSpan("data response", 13)));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("data", value.data));
                VerifyOrReturn(CheckValueAsString("data.Value()", value.data.Value(), chip::CharSpan("data response", 13)));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("data", value.data));
                VerifyOrReturn(CheckValueAsString("data.Value()", value.data.Value(), chip::CharSpan("data response", 13)));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("data", value.data));
                VerifyOrReturn(CheckValueAsString("data.Value()", value.data.Value(), chip::CharSpan("data response", 13)));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::MediaPlayback::Structs::PlaybackPosition::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("sampledPosition", value));
                VerifyOrReturn(CheckValue("sampledPosition.Value().updatedAt", value.Value().updatedAt, 0ULL));
                VerifyOrReturn(CheckValueNonNull("sampledPosition.Value().position", value.Value().position));
                VerifyOrReturn(CheckValue("sampledPosition.Value().position.Value()", value.Value().position.Value(), 500ULL));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("data", value.data));
                VerifyOrReturn(CheckValueAsString("data.Value()", value.data.Value(), chip::CharSpan("data response", 13)));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::MediaPlayback::Structs::PlaybackPosition::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("sampledPosition", value));
                VerifyOrReturn(CheckValue("sampledPosition.Value().updatedAt", value.Value().updatedAt, 0ULL));
                VerifyOrReturn(CheckValueNonNull("sampledPosition.Value().position", value.Value().position));
                VerifyOrReturn(CheckValue("sampledPosition.Value().position.Value()", value.Value().position.Value(), 400ULL));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("data", value.data));
                VerifyOrReturn(CheckValueAsString("data.Value()", value.data.Value(), chip::CharSpan("data response", 13)));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::MediaPlayback::Structs::PlaybackPosition::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("sampledPosition", value));
                VerifyOrReturn(CheckValue("sampledPosition.Value().updatedAt", value.Value().updatedAt, 0ULL));
                VerifyOrReturn(CheckValueNonNull("sampledPosition.Value().position", value.Value().position));
                VerifyOrReturn(CheckValue("sampledPosition.Value().position.Value()", value.Value().position.Value(), 1000ULL));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read attribute playback state");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), MediaPlayback::Id, MediaPlayback::Attributes::CurrentState::Id,
                                 true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read attribute start time");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), MediaPlayback::Id, MediaPlayback::Attributes::StartTime::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read attribute duration");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), MediaPlayback::Id, MediaPlayback::Attributes::Duration::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read attribute position");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), MediaPlayback::Id, MediaPlayback::Attributes::SampledPosition::Id,
                                 true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read attribute playback speed");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), MediaPlayback::Id, MediaPlayback::Attributes::PlaybackSpeed::Id,
                                 true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read attribute seek range end");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), MediaPlayback::Id, MediaPlayback::Attributes::SeekRangeEnd::Id,
                                 true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read attribute seek range start");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), MediaPlayback::Id, MediaPlayback::Attributes::SeekRangeStart::Id,
                                 true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Media Playback Play Command");
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::Play::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(3), MediaPlayback::Id, MediaPlayback::Commands::Play::Id, value,
                               chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "Media Playback Pause Command");
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::Pause::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(3), MediaPlayback::Id, MediaPlayback::Commands::Pause::Id, value,
                               chip::NullOptional

            );
        }
        case 10: {
            LogStep(10, "Media Playback Stop Command");
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::StopPlayback::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(3), MediaPlayback::Id, MediaPlayback::Commands::StopPlayback::Id, value,
                               chip::NullOptional

            );
        }
        case 11: {
            LogStep(11, "Media Playback Start Over Command");
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::StartOver::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(3), MediaPlayback::Id, MediaPlayback::Commands::StartOver::Id, value,
                               chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "Media Playback Previous Command");
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::Previous::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(3), MediaPlayback::Id, MediaPlayback::Commands::Previous::Id, value,
                               chip::NullOptional

            );
        }
        case 13: {
            LogStep(13, "Media Playback Next Command");
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::Next::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(3), MediaPlayback::Id, MediaPlayback::Commands::Next::Id, value,
                               chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "Media Playback Rewind Command");
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::Rewind::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(3), MediaPlayback::Id, MediaPlayback::Commands::Rewind::Id, value,
                               chip::NullOptional

            );
        }
        case 15: {
            LogStep(15, "Media Playback Fast Forward Command");
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::FastForward::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(3), MediaPlayback::Id, MediaPlayback::Commands::FastForward::Id, value,
                               chip::NullOptional

            );
        }
        case 16: {
            LogStep(16, "Media Playback Skip Forward Command");
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::SkipForward::Type value;
            value.deltaPositionMilliseconds = 500ULL;
            return SendCommand(kIdentityAlpha, GetEndpoint(3), MediaPlayback::Id, MediaPlayback::Commands::SkipForward::Id, value,
                               chip::NullOptional

            );
        }
        case 17: {
            LogStep(17, "Read attribute position after skip forward");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), MediaPlayback::Id, MediaPlayback::Attributes::SampledPosition::Id,
                                 true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Media Playback Skip Backward Command");
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::SkipBackward::Type value;
            value.deltaPositionMilliseconds = 100ULL;
            return SendCommand(kIdentityAlpha, GetEndpoint(3), MediaPlayback::Id, MediaPlayback::Commands::SkipBackward::Id, value,
                               chip::NullOptional

            );
        }
        case 19: {
            LogStep(19, "Read attribute position after skip backward");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), MediaPlayback::Id, MediaPlayback::Attributes::SampledPosition::Id,
                                 true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Media Playback Seek Command");
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::Seek::Type value;
            value.position = 1000ULL;
            return SendCommand(kIdentityAlpha, GetEndpoint(3), MediaPlayback::Id, MediaPlayback::Commands::Seek::Id, value,
                               chip::NullOptional

            );
        }
        case 21: {
            LogStep(21, "Read attribute position after seek");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), MediaPlayback::Id, MediaPlayback::Attributes::SampledPosition::Id,
                                 true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TV_ChannelClusterSuite : public TestCommand
{
public:
    TV_ChannelClusterSuite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("TV_ChannelCluster", 7, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TV_ChannelClusterSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::Channel::Structs::ChannelInfo::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("channelList", iter_0, 0));
                    VerifyOrReturn(CheckValue("channelList[0].majorNumber", iter_0.GetValue().majorNumber, 6U));
                    VerifyOrReturn(CheckValue("channelList[0].minorNumber", iter_0.GetValue().minorNumber, 0U));
                    VerifyOrReturn(CheckValuePresent("channelList[0].name", iter_0.GetValue().name));
                    VerifyOrReturn(CheckValueAsString("channelList[0].name.Value()", iter_0.GetValue().name.Value(),
                                                      chip::CharSpan("ABC", 3)));
                    VerifyOrReturn(CheckValuePresent("channelList[0].callSign", iter_0.GetValue().callSign));
                    VerifyOrReturn(CheckValueAsString("channelList[0].callSign.Value()", iter_0.GetValue().callSign.Value(),
                                                      chip::CharSpan("KAAL-TV", 7)));
                    VerifyOrReturn(CheckValuePresent("channelList[0].affiliateCallSign", iter_0.GetValue().affiliateCallSign));
                    VerifyOrReturn(CheckValueAsString("channelList[0].affiliateCallSign.Value()",
                                                      iter_0.GetValue().affiliateCallSign.Value(), chip::CharSpan("KAAL", 4)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("channelList", iter_0, 1));
                    VerifyOrReturn(CheckValue("channelList[1].majorNumber", iter_0.GetValue().majorNumber, 9U));
                    VerifyOrReturn(CheckValue("channelList[1].minorNumber", iter_0.GetValue().minorNumber, 1U));
                    VerifyOrReturn(CheckValuePresent("channelList[1].name", iter_0.GetValue().name));
                    VerifyOrReturn(CheckValueAsString("channelList[1].name.Value()", iter_0.GetValue().name.Value(),
                                                      chip::CharSpan("PBS", 3)));
                    VerifyOrReturn(CheckValuePresent("channelList[1].callSign", iter_0.GetValue().callSign));
                    VerifyOrReturn(CheckValueAsString("channelList[1].callSign.Value()", iter_0.GetValue().callSign.Value(),
                                                      chip::CharSpan("KCTS-TV", 7)));
                    VerifyOrReturn(CheckValuePresent("channelList[1].affiliateCallSign", iter_0.GetValue().affiliateCallSign));
                    VerifyOrReturn(CheckValueAsString("channelList[1].affiliateCallSign.Value()",
                                                      iter_0.GetValue().affiliateCallSign.Value(), chip::CharSpan("KCTS", 4)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("channelList", iter_0, 2));
                    VerifyOrReturn(CheckValue("channelList[2].majorNumber", iter_0.GetValue().majorNumber, 9U));
                    VerifyOrReturn(CheckValue("channelList[2].minorNumber", iter_0.GetValue().minorNumber, 2U));
                    VerifyOrReturn(CheckValuePresent("channelList[2].name", iter_0.GetValue().name));
                    VerifyOrReturn(CheckValueAsString("channelList[2].name.Value()", iter_0.GetValue().name.Value(),
                                                      chip::CharSpan("PBS Kids", 8)));
                    VerifyOrReturn(CheckValuePresent("channelList[2].callSign", iter_0.GetValue().callSign));
                    VerifyOrReturn(CheckValueAsString("channelList[2].callSign.Value()", iter_0.GetValue().callSign.Value(),
                                                      chip::CharSpan("KCTS-TV", 7)));
                    VerifyOrReturn(CheckValuePresent("channelList[2].affiliateCallSign", iter_0.GetValue().affiliateCallSign));
                    VerifyOrReturn(CheckValueAsString("channelList[2].affiliateCallSign.Value()",
                                                      iter_0.GetValue().affiliateCallSign.Value(), chip::CharSpan("KCTS", 4)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("channelList", iter_0, 3));
                    VerifyOrReturn(CheckValue("channelList[3].majorNumber", iter_0.GetValue().majorNumber, 9U));
                    VerifyOrReturn(CheckValue("channelList[3].minorNumber", iter_0.GetValue().minorNumber, 3U));
                    VerifyOrReturn(CheckValuePresent("channelList[3].name", iter_0.GetValue().name));
                    VerifyOrReturn(CheckValueAsString("channelList[3].name.Value()", iter_0.GetValue().name.Value(),
                                                      chip::CharSpan("World Channel", 13)));
                    VerifyOrReturn(CheckValuePresent("channelList[3].callSign", iter_0.GetValue().callSign));
                    VerifyOrReturn(CheckValueAsString("channelList[3].callSign.Value()", iter_0.GetValue().callSign.Value(),
                                                      chip::CharSpan("KCTS-TV", 7)));
                    VerifyOrReturn(CheckValuePresent("channelList[3].affiliateCallSign", iter_0.GetValue().affiliateCallSign));
                    VerifyOrReturn(CheckValueAsString("channelList[3].affiliateCallSign.Value()",
                                                      iter_0.GetValue().affiliateCallSign.Value(), chip::CharSpan("KCTS", 4)));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("channelList", iter_0, 4));
                }
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::Channel::Structs::LineupInfo::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("lineup", value));
                VerifyOrReturn(
                    CheckValueAsString("lineup.Value().operatorName", value.Value().operatorName, chip::CharSpan("Comcast", 7)));
                VerifyOrReturn(CheckValuePresent("lineup.Value().lineupName", value.Value().lineupName));
                VerifyOrReturn(CheckValueAsString("lineup.Value().lineupName.Value()", value.Value().lineupName.Value(),
                                                  chip::CharSpan("Comcast King County", 19)));
                VerifyOrReturn(CheckValuePresent("lineup.Value().postalCode", value.Value().postalCode));
                VerifyOrReturn(CheckValueAsString("lineup.Value().postalCode.Value()", value.Value().postalCode.Value(),
                                                  chip::CharSpan("98052", 5)));
                VerifyOrReturn(CheckValue("lineup.Value().lineupInfoType", value.Value().lineupInfoType, 0U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::Channel::Structs::ChannelInfo::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentChannel", value));
                VerifyOrReturn(CheckValue("currentChannel.Value().majorNumber", value.Value().majorNumber, 6U));
                VerifyOrReturn(CheckValue("currentChannel.Value().minorNumber", value.Value().minorNumber, 0U));
                VerifyOrReturn(CheckValuePresent("currentChannel.Value().name", value.Value().name));
                VerifyOrReturn(CheckValueAsString("currentChannel.Value().name.Value()", value.Value().name.Value(),
                                                  chip::CharSpan("ABC", 3)));
                VerifyOrReturn(CheckValuePresent("currentChannel.Value().callSign", value.Value().callSign));
                VerifyOrReturn(CheckValueAsString("currentChannel.Value().callSign.Value()", value.Value().callSign.Value(),
                                                  chip::CharSpan("KAAL-TV", 7)));
                VerifyOrReturn(CheckValuePresent("currentChannel.Value().affiliateCallSign", value.Value().affiliateCallSign));
                VerifyOrReturn(CheckValueAsString("currentChannel.Value().affiliateCallSign.Value()",
                                                  value.Value().affiliateCallSign.Value(), chip::CharSpan("KAAL", 4)));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Channel::Commands::ChangeChannelResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("data", value.data));
                VerifyOrReturn(CheckValueAsString("data.Value()", value.data.Value(), chip::CharSpan("data response", 13)));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read attribute Channel list");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::ChannelList::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read attribute channel lineup");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::Lineup::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read attribute current channel");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::CurrentChannel::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Change Channel Command");
            ListFreer listFreer;
            chip::app::Clusters::Channel::Commands::ChangeChannel::Type value;
            value.match = chip::Span<const char>("PBSgarbage: not in length on purpose", 3);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Commands::ChangeChannel::Id, value,
                               chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "Change Channel By Number Command");
            ListFreer listFreer;
            chip::app::Clusters::Channel::Commands::ChangeChannelByNumber::Type value;
            value.majorNumber = 6U;
            value.minorNumber = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Commands::ChangeChannelByNumber::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Skip Channel Command");
            ListFreer listFreer;
            chip::app::Clusters::Channel::Commands::SkipChannel::Type value;
            value.count = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Commands::SkipChannel::Id, value,
                               chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TV_LowPowerClusterSuite : public TestCommand
{
public:
    TV_LowPowerClusterSuite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("TV_LowPowerCluster", 2, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TV_LowPowerClusterSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Sleep Input Status Command");
            ListFreer listFreer;
            chip::app::Clusters::LowPower::Commands::Sleep::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LowPower::Id, LowPower::Commands::Sleep::Id, value,
                               chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TV_ContentLauncherClusterSuite : public TestCommand
{
public:
    TV_ContentLauncherClusterSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TV_ContentLauncherCluster", 5, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TV_ContentLauncherClusterSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CharSpan> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acceptHeader", iter_0, 0));
                    VerifyOrReturn(CheckValueAsString("acceptHeader[0]", iter_0.GetValue(), chip::CharSpan("example", 7)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acceptHeader", iter_0, 1));
                    VerifyOrReturn(CheckValueAsString("acceptHeader[1]", iter_0.GetValue(), chip::CharSpan("example", 7)));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptHeader", iter_0, 2));
                }
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("supportedStreamingProtocols", value, 0UL));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::ContentLauncher::Commands::LaunchResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("data", value.data));
                VerifyOrReturn(CheckValueAsString("data.Value()", value.data.Value(), chip::CharSpan("exampleData", 11)));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::ContentLauncher::Commands::LaunchResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("data", value.data));
                VerifyOrReturn(CheckValueAsString("data.Value()", value.data.Value(), chip::CharSpan("exampleData", 11)));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read attribute accept header list");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ContentLauncher::Id, ContentLauncher::Attributes::AcceptHeader::Id,
                                 true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read attribute supported streaming protocols");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ContentLauncher::Id,
                                 ContentLauncher::Attributes::SupportedStreamingProtocols::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Launch Content Command");
            ListFreer listFreer;
            chip::app::Clusters::ContentLauncher::Commands::LaunchContent::Type value;

            {
                auto * listHolder_1 = new ListHolder<chip::app::Clusters::ContentLauncher::Structs::Parameter::Type>(1);
                listFreer.add(listHolder_1);

                listHolder_1->mList[0].type  = static_cast<chip::app::Clusters::ContentLauncher::ParameterEnum>(1);
                listHolder_1->mList[0].value = chip::Span<const char>("exampleValuegarbage: not in length on purpose", 12);
                listHolder_1->mList[0].externalIDList.Emplace();

                {
                    auto * listHolder_4 = new ListHolder<chip::app::Clusters::ContentLauncher::Structs::AdditionalInfo::Type>(1);
                    listFreer.add(listHolder_4);

                    listHolder_4->mList[0].name  = chip::Span<const char>("namegarbage: not in length on purpose", 4);
                    listHolder_4->mList[0].value = chip::Span<const char>("valuegarbage: not in length on purpose", 5);

                    listHolder_1->mList[0].externalIDList.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::ContentLauncher::Structs::AdditionalInfo::Type>(
                            listHolder_4->mList, 1);
                }

                value.search.parameterList =
                    chip::app::DataModel::List<chip::app::Clusters::ContentLauncher::Structs::Parameter::Type>(listHolder_1->mList,
                                                                                                               1);
            }

            value.autoPlay = true;
            value.data.Emplace();
            value.data.Value() = chip::Span<const char>("exampleDatagarbage: not in length on purpose", 11);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ContentLauncher::Id, ContentLauncher::Commands::LaunchContent::Id,
                               value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Launch URL Command");
            ListFreer listFreer;
            chip::app::Clusters::ContentLauncher::Commands::LaunchURL::Type value;
            value.contentURL = chip::Span<const char>("exampleUrlgarbage: not in length on purpose", 10);
            value.displayString.Emplace();
            value.displayString.Value() = chip::Span<const char>("exampleDisplayStringgarbage: not in length on purpose", 20);
            value.brandingInformation.Emplace();

            value.brandingInformation.Value().providerName =
                chip::Span<const char>("exampleNamegarbage: not in length on purpose", 11);
            value.brandingInformation.Value().background.Emplace();

            value.brandingInformation.Value().background.Value().imageUrl.Emplace();
            value.brandingInformation.Value().background.Value().imageUrl.Value() =
                chip::Span<const char>("exampleUrlgarbage: not in length on purpose", 10);
            value.brandingInformation.Value().background.Value().color.Emplace();
            value.brandingInformation.Value().background.Value().color.Value() =
                chip::Span<const char>("exampleColorgarbage: not in length on purpose", 12);
            value.brandingInformation.Value().background.Value().size.Emplace();

            value.brandingInformation.Value().background.Value().size.Value().width  = 0;
            value.brandingInformation.Value().background.Value().size.Value().height = 0;
            value.brandingInformation.Value().background.Value().size.Value().metric =
                static_cast<chip::app::Clusters::ContentLauncher::MetricTypeEnum>(0);

            value.brandingInformation.Value().logo.Emplace();

            value.brandingInformation.Value().logo.Value().imageUrl.Emplace();
            value.brandingInformation.Value().logo.Value().imageUrl.Value() =
                chip::Span<const char>("exampleUrlgarbage: not in length on purpose", 10);
            value.brandingInformation.Value().logo.Value().color.Emplace();
            value.brandingInformation.Value().logo.Value().color.Value() =
                chip::Span<const char>("exampleColorgarbage: not in length on purpose", 12);
            value.brandingInformation.Value().logo.Value().size.Emplace();

            value.brandingInformation.Value().logo.Value().size.Value().width  = 0;
            value.brandingInformation.Value().logo.Value().size.Value().height = 0;
            value.brandingInformation.Value().logo.Value().size.Value().metric =
                static_cast<chip::app::Clusters::ContentLauncher::MetricTypeEnum>(0);

            value.brandingInformation.Value().progressBar.Emplace();

            value.brandingInformation.Value().progressBar.Value().imageUrl.Emplace();
            value.brandingInformation.Value().progressBar.Value().imageUrl.Value() =
                chip::Span<const char>("exampleUrlgarbage: not in length on purpose", 10);
            value.brandingInformation.Value().progressBar.Value().color.Emplace();
            value.brandingInformation.Value().progressBar.Value().color.Value() =
                chip::Span<const char>("exampleColorgarbage: not in length on purpose", 12);
            value.brandingInformation.Value().progressBar.Value().size.Emplace();

            value.brandingInformation.Value().progressBar.Value().size.Value().width  = 0;
            value.brandingInformation.Value().progressBar.Value().size.Value().height = 0;
            value.brandingInformation.Value().progressBar.Value().size.Value().metric =
                static_cast<chip::app::Clusters::ContentLauncher::MetricTypeEnum>(0);

            value.brandingInformation.Value().splash.Emplace();

            value.brandingInformation.Value().splash.Value().imageUrl.Emplace();
            value.brandingInformation.Value().splash.Value().imageUrl.Value() =
                chip::Span<const char>("exampleUrlgarbage: not in length on purpose", 10);
            value.brandingInformation.Value().splash.Value().color.Emplace();
            value.brandingInformation.Value().splash.Value().color.Value() =
                chip::Span<const char>("exampleColorgarbage: not in length on purpose", 12);
            value.brandingInformation.Value().splash.Value().size.Emplace();

            value.brandingInformation.Value().splash.Value().size.Value().width  = 0;
            value.brandingInformation.Value().splash.Value().size.Value().height = 0;
            value.brandingInformation.Value().splash.Value().size.Value().metric =
                static_cast<chip::app::Clusters::ContentLauncher::MetricTypeEnum>(0);

            value.brandingInformation.Value().waterMark.Emplace();

            value.brandingInformation.Value().waterMark.Value().imageUrl.Emplace();
            value.brandingInformation.Value().waterMark.Value().imageUrl.Value() =
                chip::Span<const char>("exampleUrlgarbage: not in length on purpose", 10);
            value.brandingInformation.Value().waterMark.Value().color.Emplace();
            value.brandingInformation.Value().waterMark.Value().color.Value() =
                chip::Span<const char>("exampleColorgarbage: not in length on purpose", 12);
            value.brandingInformation.Value().waterMark.Value().size.Emplace();

            value.brandingInformation.Value().waterMark.Value().size.Value().width  = 0;
            value.brandingInformation.Value().waterMark.Value().size.Value().height = 0;
            value.brandingInformation.Value().waterMark.Value().size.Value().metric =
                static_cast<chip::app::Clusters::ContentLauncher::MetricTypeEnum>(0);

            return SendCommand(kIdentityAlpha, GetEndpoint(1), ContentLauncher::Id, ContentLauncher::Commands::LaunchURL::Id, value,
                               chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TV_MediaInputClusterSuite : public TestCommand
{
public:
    TV_MediaInputClusterSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TV_MediaInputCluster", 8, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TV_MediaInputClusterSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::MediaInput::Structs::InputInfo::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("inputList", iter_0, 0));
                    VerifyOrReturn(CheckValue("inputList[0].index", iter_0.GetValue().index, 1U));
                    VerifyOrReturn(CheckValue("inputList[0].inputType", iter_0.GetValue().inputType, 4U));
                    VerifyOrReturn(CheckValueAsString("inputList[0].name", iter_0.GetValue().name, chip::CharSpan("HDMI", 4)));
                    VerifyOrReturn(CheckValueAsString("inputList[0].description", iter_0.GetValue().description,
                                                      chip::CharSpan("High-Definition Multimedia Interface", 36)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("inputList", iter_0, 1));
                    VerifyOrReturn(CheckValue("inputList[1].index", iter_0.GetValue().index, 2U));
                    VerifyOrReturn(CheckValue("inputList[1].inputType", iter_0.GetValue().inputType, 4U));
                    VerifyOrReturn(CheckValueAsString("inputList[1].name", iter_0.GetValue().name, chip::CharSpan("HDMI", 4)));
                    VerifyOrReturn(CheckValueAsString("inputList[1].description", iter_0.GetValue().description,
                                                      chip::CharSpan("High-Definition Multimedia Interface", 36)));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("inputList", iter_0, 2));
                }
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentInput", value, 1U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::MediaInput::Structs::InputInfo::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("inputList", iter_0, 0));
                    VerifyOrReturn(CheckValue("inputList[0].index", iter_0.GetValue().index, 1U));
                    VerifyOrReturn(CheckValue("inputList[0].inputType", iter_0.GetValue().inputType, 4U));
                    VerifyOrReturn(CheckValueAsString("inputList[0].name", iter_0.GetValue().name, chip::CharSpan("HDMI Test", 9)));
                    VerifyOrReturn(CheckValueAsString("inputList[0].description", iter_0.GetValue().description,
                                                      chip::CharSpan("High-Definition Multimedia Interface", 36)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("inputList", iter_0, 1));
                    VerifyOrReturn(CheckValue("inputList[1].index", iter_0.GetValue().index, 2U));
                    VerifyOrReturn(CheckValue("inputList[1].inputType", iter_0.GetValue().inputType, 4U));
                    VerifyOrReturn(CheckValueAsString("inputList[1].name", iter_0.GetValue().name, chip::CharSpan("HDMI", 4)));
                    VerifyOrReturn(CheckValueAsString("inputList[1].description", iter_0.GetValue().description,
                                                      chip::CharSpan("High-Definition Multimedia Interface", 36)));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("inputList", iter_0, 2));
                }
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read attribute media input list");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Attributes::InputList::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read current media input");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Attributes::CurrentInput::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Select Input Command");
            ListFreer listFreer;
            chip::app::Clusters::MediaInput::Commands::SelectInput::Type value;
            value.index = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Commands::SelectInput::Id, value,
                               chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Hide Input Status Command");
            ListFreer listFreer;
            chip::app::Clusters::MediaInput::Commands::HideInputStatus::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Commands::HideInputStatus::Id, value,
                               chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "Show Input Status Command");
            ListFreer listFreer;
            chip::app::Clusters::MediaInput::Commands::ShowInputStatus::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Commands::ShowInputStatus::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Rename Input Command");
            ListFreer listFreer;
            chip::app::Clusters::MediaInput::Commands::RenameInput::Type value;
            value.index = 1U;
            value.name  = chip::Span<const char>("HDMI Testgarbage: not in length on purpose", 9);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Commands::RenameInput::Id, value,
                               chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "Read attribute media input list");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Attributes::InputList::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestCASERecoverySuite : public TestCommand
{
public:
    TestCASERecoverySuite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("TestCASERecovery", 7, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestCASERecoverySuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("dataModelRevision", value, 1U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("dataModelRevision", value, 1U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read an attribute");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::DataModelRevision::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Reboot the server");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
            return Reboot(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "Re-get our session, but without expiring sesssions");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            value.expireExistingSession.Emplace();
            value.expireExistingSession.Value() = false;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 4: {
            LogStep(4, "Read an attribute again");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::DataModelRevision::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Re-get our session, but without expiring sesssions");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            value.expireExistingSession.Emplace();
            value.expireExistingSession.Value() = false;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6, "Read an attribute a third time");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::DataModelRevision::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestClusterSuite : public TestCommand
{
public:
    TestClusterSuite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("TestCluster", 490, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestClusterSuite()
    {
        if (nullableOctetStrTestValueBuffer != nullptr)
        {
            chip::Platform::MemoryFree(nullableOctetStrTestValueBuffer);
            nullableOctetStrTestValueBuffer = nullptr;
        }
        if (nullableCharStringSaveBuffer != nullptr)
        {
            chip::Platform::MemoryFree(nullableCharStringSaveBuffer);
            nullableCharStringSaveBuffer = nullptr;
        }
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::app::DataModel::Nullable<bool> booValueNull;
    chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap>> nullableValue254;
    chip::app::DataModel::Nullable<chip::app::Clusters::UnitTesting::SimpleEnum> nullableEnumAttr3;
    uint8_t * nullableOctetStrTestValueBuffer = nullptr;
    chip::app::DataModel::Nullable<chip::ByteSpan> nullableOctetStrTestValue;
    char * nullableCharStringSaveBuffer = nullptr;
    chip::app::DataModel::Nullable<chip::CharSpan> nullableCharStringSave;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::TestSpecificResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("returnValue", value.returnValue, 7U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::TestAddArgumentsResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("returnValue", value.returnValue, 20U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("boolean", value, 0));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("boolean", value, 1));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("boolean", value, 0));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap8", value, 0U));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap8", value, 255U));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap8", value, 0U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap16", value, 0U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap16", value, 65535U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap16", value, 0U));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap32", value, 0UL));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap32", value, 4294967295UL));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap32", value, 0UL));
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap64", value, 0ULL));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap64", value, 18446744073709551615ULL));
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap64", value, 0ULL));
            }
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int8u", value, 0U));
            }
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int8u", value, 255U));
            }
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int8u", value, 0U));
            }
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int16u", value, 0U));
            }
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int16u", value, 65535U));
            }
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int16u", value, 0U));
            }
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int32u", value, 0UL));
            }
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int32u", value, 4294967295UL));
            }
            break;
        case 44:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 45:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int32u", value, 0UL));
            }
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int64u", value, 0ULL));
            }
            break;
        case 47:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 48:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int64u", value, 18446744073709551615ULL));
            }
            break;
        case 49:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 50:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int64u", value, 0ULL));
            }
            break;
        case 51:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int8s", value, 0));
            }
            break;
        case 52:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 53:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int8s", value, 127));
            }
            break;
        case 54:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 55:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int8s", value, -128));
            }
            break;
        case 56:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 57:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int8s", value, 0));
            }
            break;
        case 58:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int16s", value, 0));
            }
            break;
        case 59:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 60:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int16s", value, 32767));
            }
            break;
        case 61:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 62:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int16s", value, -32768));
            }
            break;
        case 63:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 64:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int16s", value, 0));
            }
            break;
        case 65:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int32s", value, 0L));
            }
            break;
        case 66:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 67:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int32s", value, 2147483647L));
            }
            break;
        case 68:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 69:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int32s", value, -2147483648L));
            }
            break;
        case 70:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 71:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int32s", value, 0L));
            }
            break;
        case 72:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int64s", value, 0LL));
            }
            break;
        case 73:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 74:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int64s", value, 9223372036854775807LL));
            }
            break;
        case 75:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 76:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int64s", value, -9223372036854775807LL));
            }
            break;
        case 77:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 78:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int64s", value, 0LL));
            }
            break;
        case 79:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                float value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("floatSingle", value, 0.0f));
            }
            break;
        case 80:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 81:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                float value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("floatSingle", value, 0.1f));
            }
            break;
        case 82:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 83:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                float value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("floatSingle", value, 17000000000.0f));
            }
            break;
        case 84:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 85:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                float value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("floatSingle", value, 1.7e-10f));
            }
            break;
        case 86:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 87:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                float value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("floatSingle", value, 0.0f));
            }
            break;
        case 88:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                double value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("floatDouble", value, 0));
            }
            break;
        case 89:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 90:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                double value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("floatDouble", value, 0.1234567890123));
            }
            break;
        case 91:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 92:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                double value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("floatDouble", value, 1.7e+200));
            }
            break;
        case 93:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 94:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                double value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("floatDouble", value, 1.7e-200));
            }
            break;
        case 95:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 96:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                double value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("floatDouble", value, 0));
            }
            break;
        case 97:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enum8", value, 0U));
            }
            break;
        case 98:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 99:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enum8", value, 255U));
            }
            break;
        case 100:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 101:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enum8", value, 0U));
            }
            break;
        case 102:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enum16", value, 0U));
            }
            break;
        case 103:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 104:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enum16", value, 65535U));
            }
            break;
        case 105:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 106:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enum16", value, 0U));
            }
            break;
        case 107:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::ByteSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("octetString", value, chip::ByteSpan(chip::Uint8::from_const_char(""), 0)));
            }
            break;
        case 108:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 109:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::ByteSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(
                    CheckValueAsString("octetString", value, chip::ByteSpan(chip::Uint8::from_const_char("Tes\000ti\000ng"), 9)));
            }
            break;
        case 110:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 111:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::ByteSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("octetString", value,
                                                  chip::ByteSpan(chip::Uint8::from_const_char("\x00\x01\x02\x03\x04\x05"), 6)));
            }
            break;
        case 112:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 113:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::ByteSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("octetString", value,
                                                  chip::ByteSpan(chip::Uint8::from_const_char("\015\012\377\042\240"), 5)));
            }
            break;
        case 114:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 115:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::ByteSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(
                    CheckValueAsString("octetString", value, chip::ByteSpan(chip::Uint8::from_const_char("TestValue"), 9)));
            }
            break;
        case 116:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 117:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::ByteSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(
                    CheckValueAsString("octetString", value, chip::ByteSpan(chip::Uint8::from_const_char("TestValue"), 9)));
            }
            break;
        case 118:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 119:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::ByteSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("longOctetString", value, chip::ByteSpan(chip::Uint8::from_const_char(""), 0)));
            }
            break;
        case 120:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 121:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::ByteSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString(
                    "longOctetString", value,
                    chip::ByteSpan(
                        chip::Uint8::from_const_char(
                            "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
                            "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
                            "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"),
                        300)));
            }
            break;
        case 122:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 123:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("charString", value, chip::CharSpan("", 0)));
            }
            break;
        case 124:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 125:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("charString", value, chip::CharSpan("☉T☉", 7)));
            }
            break;
        case 126:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 127:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("charString", value, chip::CharSpan("☉T☉", 7)));
            }
            break;
        case 128:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 129:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("longCharString", value, chip::CharSpan("", 0)));
            }
            break;
        case 130:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 131:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString(
                    "longCharString", value,
                    chip::CharSpan(
                        "☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉"
                        "☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉"
                        "☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉",
                        900)));
            }
            break;
        case 132:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 133:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::ByteSpan> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listLongOctetString", iter_0, 0));
                    VerifyOrReturn(CheckValueAsString(
                        "listLongOctetString[0]", iter_0.GetValue(),
                        chip::ByteSpan(chip::Uint8::from_const_char(
                                           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456"
                                           "789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                                           "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234"
                                           "56789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                           "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef012"
                                           "3456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"),
                                       512)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listLongOctetString", iter_0, 1));
                    VerifyOrReturn(CheckValueAsString(
                        "listLongOctetString[1]", iter_0.GetValue(),
                        chip::ByteSpan(chip::Uint8::from_const_char(
                                           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456"
                                           "789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                                           "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234"
                                           "56789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                           "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef012"
                                           "3456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"),
                                       512)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listLongOctetString", iter_0, 2));
                    VerifyOrReturn(CheckValueAsString(
                        "listLongOctetString[2]", iter_0.GetValue(),
                        chip::ByteSpan(chip::Uint8::from_const_char(
                                           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456"
                                           "789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                                           "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234"
                                           "56789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                           "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef012"
                                           "3456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"),
                                       512)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listLongOctetString", iter_0, 3));
                    VerifyOrReturn(CheckValueAsString(
                        "listLongOctetString[3]", iter_0.GetValue(),
                        chip::ByteSpan(chip::Uint8::from_const_char(
                                           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456"
                                           "789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                                           "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234"
                                           "56789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                           "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef012"
                                           "3456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"),
                                       512)));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("listLongOctetString", iter_0, 4));
                }
            }
            break;
        case 134:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 135:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::ByteSpan> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listLongOctetString", iter_0, 0));
                    VerifyOrReturn(CheckValueAsString(
                        "listLongOctetString[0]", iter_0.GetValue(),
                        chip::ByteSpan(chip::Uint8::from_const_char(
                                           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456"
                                           "789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                                           "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234"
                                           "56789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                           "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef012"
                                           "3456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"),
                                       512)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listLongOctetString", iter_0, 1));
                    VerifyOrReturn(CheckValueAsString(
                        "listLongOctetString[1]", iter_0.GetValue(),
                        chip::ByteSpan(chip::Uint8::from_const_char(
                                           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456"
                                           "789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                                           "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234"
                                           "56789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                           "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef012"
                                           "3456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"),
                                       512)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listLongOctetString", iter_0, 2));
                    VerifyOrReturn(CheckValueAsString(
                        "listLongOctetString[2]", iter_0.GetValue(),
                        chip::ByteSpan(chip::Uint8::from_const_char(
                                           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456"
                                           "789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                                           "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234"
                                           "56789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                           "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef012"
                                           "3456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"),
                                       512)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listLongOctetString", iter_0, 3));
                    VerifyOrReturn(CheckValueAsString(
                        "listLongOctetString[3]", iter_0.GetValue(),
                        chip::ByteSpan(chip::Uint8::from_const_char(
                                           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456"
                                           "789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                                           "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234"
                                           "56789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                           "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef012"
                                           "3456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"),
                                       512)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listLongOctetString", iter_0, 4));
                    VerifyOrReturn(CheckValueAsString(
                        "listLongOctetString[4]", iter_0.GetValue(),
                        chip::ByteSpan(chip::Uint8::from_const_char(
                                           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456"
                                           "789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                                           "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234"
                                           "56789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                           "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef012"
                                           "3456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"),
                                       512)));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("listLongOctetString", iter_0, 5));
                }
            }
            break;
        case 136:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("epochUs", value, 0ULL));
            }
            break;
        case 137:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 138:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("epochUs", value, 18446744073709551615ULL));
            }
            break;
        case 139:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 140:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("epochUs", value, 0ULL));
            }
            break;
        case 141:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("epochS", value, 0UL));
            }
            break;
        case 142:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 143:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("epochS", value, 4294967295UL));
            }
            break;
        case 144:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 145:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("epochS", value, 0UL));
            }
            break;
        case 146:
            if (IsUnsupported(status.mStatus))
            {
                return;
            }
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("unsupported", value, 0));
            }
            break;
        case 147:
            if (IsUnsupported(status.mStatus))
            {
                return;
            }
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 148:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_ENDPOINT));
            break;
        case 149:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_CLUSTER));
            break;
        case 150:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::VendorId value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("vendorId", value, 0U));
            }
            break;
        case 151:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 152:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::VendorId value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("vendorId", value, 17U));
            }
            break;
        case 153:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 154:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::TestEnumsResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("arg1", value.arg1, 20003U));
                VerifyOrReturn(CheckValue("arg2", value.arg2, 1U));
            }
            break;
        case 155:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::TestEnumsResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("arg1", value.arg1, 20003U));
                VerifyOrReturn(CheckValue("arg2", value.arg2, 4U));
            }
            break;
        case 156:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::BooleanResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("value", value.value, true));
            }
            break;
        case 157:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::BooleanResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("value", value.value, false));
            }
            break;
        case 158:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::BooleanResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("value", value.value, true));
            }
            break;
        case 159:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::BooleanResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("value", value.value, false));
            }
            break;
        case 160:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::BooleanResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("value", value.value, true));
            }
            break;
        case 161:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::BooleanResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("value", value.value, false));
            }
            break;
        case 162:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::SimpleStructResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("arg1.a", value.arg1.a, 17U));
                VerifyOrReturn(CheckValue("arg1.b", value.arg1.b, false));
                VerifyOrReturn(CheckValue("arg1.c", value.arg1.c, 2U));
                VerifyOrReturn(
                    CheckValueAsString("arg1.d", value.arg1.d, chip::ByteSpan(chip::Uint8::from_const_char("octet_string"), 12)));
                VerifyOrReturn(CheckValueAsString("arg1.e", value.arg1.e, chip::CharSpan("char_string", 11)));
                VerifyOrReturn(CheckValue("arg1.f", value.arg1.f, 1U));
                VerifyOrReturn(CheckValue("arg1.g", value.arg1.g, 0.1f));
                VerifyOrReturn(CheckValue("arg1.h", value.arg1.h, 0.1));
            }
            break;
        case 163:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::BooleanResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("value", value.value, true));
            }
            break;
        case 164:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::BooleanResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("value", value.value, false));
            }
            break;
        case 165:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::TestListInt8UReverseResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.arg1.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.arg1)>("arg1", iter_0, 0));
                    VerifyOrReturn(CheckValue("arg1[0]", iter_0.GetValue(), 9U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.arg1)>("arg1", iter_0, 1));
                    VerifyOrReturn(CheckValue("arg1[1]", iter_0.GetValue(), 8U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.arg1)>("arg1", iter_0, 2));
                    VerifyOrReturn(CheckValue("arg1[2]", iter_0.GetValue(), 7U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.arg1)>("arg1", iter_0, 3));
                    VerifyOrReturn(CheckValue("arg1[3]", iter_0.GetValue(), 6U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.arg1)>("arg1", iter_0, 4));
                    VerifyOrReturn(CheckValue("arg1[4]", iter_0.GetValue(), 5U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.arg1)>("arg1", iter_0, 5));
                    VerifyOrReturn(CheckValue("arg1[5]", iter_0.GetValue(), 4U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.arg1)>("arg1", iter_0, 6));
                    VerifyOrReturn(CheckValue("arg1[6]", iter_0.GetValue(), 3U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.arg1)>("arg1", iter_0, 7));
                    VerifyOrReturn(CheckValue("arg1[7]", iter_0.GetValue(), 2U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.arg1)>("arg1", iter_0, 8));
                    VerifyOrReturn(CheckValue("arg1[8]", iter_0.GetValue(), 1U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.arg1)>("arg1", iter_0, 9));
                }
            }
            break;
        case 166:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::TestListInt8UReverseResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.arg1.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.arg1)>("arg1", iter_0, 0));
                }
            }
            break;
        case 167:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::BooleanResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("value", value.value, true));
            }
            break;
        case 168:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::BooleanResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("value", value.value, false));
            }
            break;
        case 169:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::BooleanResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("value", value.value, true));
            }
            break;
        case 170:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::BooleanResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("value", value.value, false));
            }
            break;
        case 171:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 172:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listInt8u", iter_0, 0));
                    VerifyOrReturn(CheckValue("listInt8u[0]", iter_0.GetValue(), 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listInt8u", iter_0, 1));
                    VerifyOrReturn(CheckValue("listInt8u[1]", iter_0.GetValue(), 2U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listInt8u", iter_0, 2));
                    VerifyOrReturn(CheckValue("listInt8u[2]", iter_0.GetValue(), 3U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listInt8u", iter_0, 3));
                    VerifyOrReturn(CheckValue("listInt8u[3]", iter_0.GetValue(), 4U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("listInt8u", iter_0, 4));
                }
            }
            break;
        case 173:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 174:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::ByteSpan> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listOctetString", iter_0, 0));
                    VerifyOrReturn(CheckValueAsString("listOctetString[0]", iter_0.GetValue(),
                                                      chip::ByteSpan(chip::Uint8::from_const_char("Test0"), 5)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listOctetString", iter_0, 1));
                    VerifyOrReturn(CheckValueAsString("listOctetString[1]", iter_0.GetValue(),
                                                      chip::ByteSpan(chip::Uint8::from_const_char("Test1"), 5)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listOctetString", iter_0, 2));
                    VerifyOrReturn(CheckValueAsString("listOctetString[2]", iter_0.GetValue(),
                                                      chip::ByteSpan(chip::Uint8::from_const_char("Test2"), 5)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listOctetString", iter_0, 3));
                    VerifyOrReturn(CheckValueAsString("listOctetString[3]", iter_0.GetValue(),
                                                      chip::ByteSpan(chip::Uint8::from_const_char("Test3"), 5)));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("listOctetString", iter_0, 4));
                }
            }
            break;
        case 175:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 176:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::UnitTesting::Structs::TestListStructOctet::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listStructOctetString", iter_0, 0));
                    VerifyOrReturn(CheckValue("listStructOctetString[0].member1", iter_0.GetValue().member1, 0ULL));
                    VerifyOrReturn(CheckValueAsString("listStructOctetString[0].member2", iter_0.GetValue().member2,
                                                      chip::ByteSpan(chip::Uint8::from_const_char("Test0"), 5)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listStructOctetString", iter_0, 1));
                    VerifyOrReturn(CheckValue("listStructOctetString[1].member1", iter_0.GetValue().member1, 1ULL));
                    VerifyOrReturn(CheckValueAsString("listStructOctetString[1].member2", iter_0.GetValue().member2,
                                                      chip::ByteSpan(chip::Uint8::from_const_char("Test1"), 5)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listStructOctetString", iter_0, 2));
                    VerifyOrReturn(CheckValue("listStructOctetString[2].member1", iter_0.GetValue().member1, 2ULL));
                    VerifyOrReturn(CheckValueAsString("listStructOctetString[2].member2", iter_0.GetValue().member2,
                                                      chip::ByteSpan(chip::Uint8::from_const_char("Test2"), 5)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listStructOctetString", iter_0, 3));
                    VerifyOrReturn(CheckValue("listStructOctetString[3].member1", iter_0.GetValue().member1, 3ULL));
                    VerifyOrReturn(CheckValueAsString("listStructOctetString[3].member2", iter_0.GetValue().member2,
                                                      chip::ByteSpan(chip::Uint8::from_const_char("Test3"), 5)));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("listStructOctetString", iter_0, 4));
                }
            }
            break;
        case 177:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::TestNullableOptionalResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("wasPresent", value.wasPresent, true));
                VerifyOrReturn(CheckValuePresent("wasNull", value.wasNull));
                VerifyOrReturn(CheckValue("wasNull.Value()", value.wasNull.Value(), false));
                VerifyOrReturn(CheckValuePresent("value", value.value));
                VerifyOrReturn(CheckValue("value.Value()", value.value.Value(), 5U));
                VerifyOrReturn(CheckValuePresent("originalValue", value.originalValue));
                VerifyOrReturn(CheckValueNonNull("originalValue.Value()", value.originalValue.Value()));
                VerifyOrReturn(CheckValue("originalValue.Value().Value()", value.originalValue.Value().Value(), 5U));
            }
            break;
        case 178:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::TestNullableOptionalResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("wasPresent", value.wasPresent, false));
            }
            break;
        case 179:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::UnitTesting::Structs::NullablesAndOptionalsStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listNullablesAndOptionalsStruct", iter_0, 0));
                    VerifyOrReturn(CheckValueNull("listNullablesAndOptionalsStruct[0].nullableInt", iter_0.GetValue().nullableInt));
                    VerifyOrReturn(
                        CheckValueNull("listNullablesAndOptionalsStruct[0].nullableString", iter_0.GetValue().nullableString));
                    VerifyOrReturn(
                        CheckValueNull("listNullablesAndOptionalsStruct[0].nullableStruct", iter_0.GetValue().nullableStruct));
                    VerifyOrReturn(
                        CheckValueNull("listNullablesAndOptionalsStruct[0].nullableList", iter_0.GetValue().nullableList));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("listNullablesAndOptionalsStruct", iter_0, 1));
                }
            }
            break;
        case 180:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 181:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::UnitTesting::Structs::NullablesAndOptionalsStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listNullablesAndOptionalsStruct", iter_0, 0));
                    VerifyOrReturn(CheckValueNull("listNullablesAndOptionalsStruct[0].nullableInt", iter_0.GetValue().nullableInt));
                    VerifyOrReturn(
                        CheckValueNull("listNullablesAndOptionalsStruct[0].nullableString", iter_0.GetValue().nullableString));
                    VerifyOrReturn(
                        CheckValueNull("listNullablesAndOptionalsStruct[0].nullableStruct", iter_0.GetValue().nullableStruct));
                    VerifyOrReturn(
                        CheckValueNonNull("listNullablesAndOptionalsStruct[0].nullableList", iter_0.GetValue().nullableList));
                    {
                        auto iter_3 = iter_0.GetValue().nullableList.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().nullableList.Value())>(
                            "listNullablesAndOptionalsStruct[0].nullableList.Value()", iter_3, 0));
                        VerifyOrReturn(
                            CheckValue("listNullablesAndOptionalsStruct[0].nullableList.Value()[0]", iter_3.GetValue(), 1U));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().nullableList.Value())>(
                            "listNullablesAndOptionalsStruct[0].nullableList.Value()", iter_3, 1));
                        VerifyOrReturn(
                            CheckValue("listNullablesAndOptionalsStruct[0].nullableList.Value()[1]", iter_3.GetValue(), 2U));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().nullableList.Value())>(
                            "listNullablesAndOptionalsStruct[0].nullableList.Value()", iter_3, 2));
                    }
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("listNullablesAndOptionalsStruct", iter_0, 1));
                }
            }
            break;
        case 182:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 183:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<bool> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableBoolean", value));
                booValueNull = value;
            }
            break;
        case 184:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 185:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<bool> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableBoolean", value));
                VerifyOrReturn(CheckValue("nullableBoolean.Value()", value.Value(), true));
            }
            break;
        case 186:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<bool> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, booValueNull));
            }
            break;
        case 187:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 188:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap>> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableBitmap8", value));
                VerifyOrReturn(CheckValue("nullableBitmap8.Value()", value.Value(), 254U));
            }
            break;
        case 189:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 190:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap>> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableBitmap8", value));
                VerifyOrReturn(CheckValue("nullableBitmap8.Value()", value.Value(), 254U));
                nullableValue254 = value;
            }
            break;
        case 191:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 192:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap>> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableBitmap8", value));
            }
            break;
        case 193:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap>> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, nullableValue254));
            }
            break;
        case 194:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 195:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap>> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableBitmap16", value));
                VerifyOrReturn(CheckValue("nullableBitmap16.Value()", value.Value(), 65534U));
            }
            break;
        case 196:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 197:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap>> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableBitmap16", value));
                VerifyOrReturn(CheckValue("nullableBitmap16.Value()", value.Value(), 65534U));
            }
            break;
        case 198:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 199:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap>> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableBitmap16", value));
            }
            break;
        case 200:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 201:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap>> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableBitmap32", value));
                VerifyOrReturn(CheckValue("nullableBitmap32.Value()", value.Value(), 4294967294UL));
            }
            break;
        case 202:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 203:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap>> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableBitmap32", value));
                VerifyOrReturn(CheckValue("nullableBitmap32.Value()", value.Value(), 4294967294UL));
            }
            break;
        case 204:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 205:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap>> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableBitmap32", value));
            }
            break;
        case 206:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 207:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap>> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableBitmap64", value));
                VerifyOrReturn(CheckValue("nullableBitmap64.Value()", value.Value(), 18446744073709551614ULL));
            }
            break;
        case 208:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 209:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap>> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableBitmap64", value));
                VerifyOrReturn(CheckValue("nullableBitmap64.Value()", value.Value(), 18446744073709551614ULL));
            }
            break;
        case 210:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 211:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap>> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableBitmap64", value));
            }
            break;
        case 212:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 213:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableInt8u", value));
                VerifyOrReturn(CheckValue("nullableInt8u.Value()", value.Value(), 0U));
            }
            break;
        case 214:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 215:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableInt8u", value));
                VerifyOrReturn(CheckValue("nullableInt8u.Value()", value.Value(), 254U));
            }
            break;
        case 216:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 217:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableInt8u", value));
                VerifyOrReturn(CheckValue("nullableInt8u.Value()", value.Value(), 254U));
            }
            break;
        case 218:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("value", value));
            }
            break;
        case 219:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 220:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableInt8u", value));
            }
            break;
        case 221:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
            }
            break;
        case 222:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, 254U));
            }
            break;
        case 223:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 224:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
            }
            break;
        case 225:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, 129U));
            }
            break;
        case 226:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 227:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableInt16u", value));
                VerifyOrReturn(CheckValue("nullableInt16u.Value()", value.Value(), 0U));
            }
            break;
        case 228:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 229:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableInt16u", value));
                VerifyOrReturn(CheckValue("nullableInt16u.Value()", value.Value(), 65534U));
            }
            break;
        case 230:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 231:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableInt16u", value));
                VerifyOrReturn(CheckValue("nullableInt16u.Value()", value.Value(), 65534U));
            }
            break;
        case 232:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 233:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableInt16u", value));
            }
            break;
        case 234:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65534U));
            }
            break;
        case 235:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, 65534U));
            }
            break;
        case 236:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 237:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65534U));
            }
            break;
        case 238:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, 32001U));
            }
            break;
        case 239:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 240:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableInt32u", value));
                VerifyOrReturn(CheckValue("nullableInt32u.Value()", value.Value(), 0UL));
            }
            break;
        case 241:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 242:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableInt32u", value));
                VerifyOrReturn(CheckValue("nullableInt32u.Value()", value.Value(), 4294967294UL));
            }
            break;
        case 243:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 244:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableInt32u", value));
                VerifyOrReturn(CheckValue("nullableInt32u.Value()", value.Value(), 4294967294UL));
            }
            break;
        case 245:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 246:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableInt32u", value));
            }
            break;
        case 247:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967294UL));
            }
            break;
        case 248:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, 4294967294UL));
            }
            break;
        case 249:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 250:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967294UL));
            }
            break;
        case 251:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, 2147483648UL));
            }
            break;
        case 252:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 253:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableInt64u", value));
                VerifyOrReturn(CheckValue("nullableInt64u.Value()", value.Value(), 0ULL));
            }
            break;
        case 254:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 255:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableInt64u", value));
                VerifyOrReturn(CheckValue("nullableInt64u.Value()", value.Value(), 18446744073709551614ULL));
            }
            break;
        case 256:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 257:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableInt64u", value));
                VerifyOrReturn(CheckValue("nullableInt64u.Value()", value.Value(), 18446744073709551614ULL));
            }
            break;
        case 258:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 259:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableInt64u", value));
            }
            break;
        case 260:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0ULL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 18446744073709551614ULL));
            }
            break;
        case 261:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, 18446744073709551614ULL));
            }
            break;
        case 262:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 263:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0ULL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 18446744073709551614ULL));
            }
            break;
        case 264:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, 18000000000000000001ULL));
            }
            break;
        case 265:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 266:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableInt8s", value));
                VerifyOrReturn(CheckValue("nullableInt8s.Value()", value.Value(), -127));
            }
            break;
        case 267:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 268:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableInt8s", value));
                VerifyOrReturn(CheckValue("nullableInt8s.Value()", value.Value(), -127));
            }
            break;
        case 269:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 270:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableInt8s", value));
            }
            break;
        case 271:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -127));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 127));
            }
            break;
        case 272:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, -127));
            }
            break;
        case 273:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 274:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -127));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 127));
            }
            break;
        case 275:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, -126));
            }
            break;
        case 276:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 277:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableInt16s", value));
                VerifyOrReturn(CheckValue("nullableInt16s.Value()", value.Value(), -32767));
            }
            break;
        case 278:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 279:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableInt16s", value));
                VerifyOrReturn(CheckValue("nullableInt16s.Value()", value.Value(), -32767));
            }
            break;
        case 280:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 281:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableInt16s", value));
            }
            break;
        case 282:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -32767));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 283:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, -32767));
            }
            break;
        case 284:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 285:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -32767));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 286:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, -32766));
            }
            break;
        case 287:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 288:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableInt32s", value));
                VerifyOrReturn(CheckValue("nullableInt32s.Value()", value.Value(), -2147483647L));
            }
            break;
        case 289:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 290:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableInt32s", value));
                VerifyOrReturn(CheckValue("nullableInt32s.Value()", value.Value(), -2147483647L));
            }
            break;
        case 291:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 292:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableInt32s", value));
            }
            break;
        case 293:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -2147483647L));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2147483647L));
            }
            break;
        case 294:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, -2147483647L));
            }
            break;
        case 295:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 296:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -2147483647L));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2147483647L));
            }
            break;
        case 297:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, -2147483646L));
            }
            break;
        case 298:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 299:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableInt64s", value));
                VerifyOrReturn(CheckValue("nullableInt64s.Value()", value.Value(), -9223372036854775807LL));
            }
            break;
        case 300:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 301:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableInt64s", value));
                VerifyOrReturn(CheckValue("nullableInt64s.Value()", value.Value(), -9223372036854775807LL));
            }
            break;
        case 302:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 303:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableInt64s", value));
            }
            break;
        case 304:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -9223372036854775807LL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9223372036854775807LL));
            }
            break;
        case 305:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, -9223372036854775807LL));
            }
            break;
        case 306:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 307:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -9223372036854775807LL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9223372036854775807LL));
            }
            break;
        case 308:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, -9223372036854775806LL));
            }
            break;
        case 309:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 310:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<float> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableFloatSingle", value));
                VerifyOrReturn(CheckValue("nullableFloatSingle.Value()", value.Value(), 0.1f));
            }
            break;
        case 311:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 312:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<float> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableFloatSingle", value));
                VerifyOrReturn(CheckValue("nullableFloatSingle.Value()", value.Value(), INFINITY));
            }
            break;
        case 313:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 314:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<float> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableFloatSingle", value));
                VerifyOrReturn(CheckValue("nullableFloatSingle.Value()", value.Value(), -INFINITY));
            }
            break;
        case 315:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 316:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<float> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableFloatSingle", value));
            }
            break;
        case 317:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 318:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<float> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableFloatSingle", value));
                VerifyOrReturn(CheckValue("nullableFloatSingle.Value()", value.Value(), 0.0f));
            }
            break;
        case 319:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 320:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<double> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableFloatDouble", value));
                VerifyOrReturn(CheckValue("nullableFloatDouble.Value()", value.Value(), 0.1234567890123));
            }
            break;
        case 321:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 322:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<double> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableFloatDouble", value));
                VerifyOrReturn(CheckValue("nullableFloatDouble.Value()", value.Value(), INFINITY));
            }
            break;
        case 323:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 324:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<double> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableFloatDouble", value));
                VerifyOrReturn(CheckValue("nullableFloatDouble.Value()", value.Value(), -INFINITY));
            }
            break;
        case 325:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 326:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<double> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableFloatDouble", value));
            }
            break;
        case 327:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 328:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<double> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableFloatDouble", value));
                VerifyOrReturn(CheckValue("nullableFloatDouble.Value()", value.Value(), 0));
            }
            break;
        case 329:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 330:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableEnum8", value));
                VerifyOrReturn(CheckValue("nullableEnum8.Value()", value.Value(), 0U));
            }
            break;
        case 331:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 332:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableEnum8", value));
                VerifyOrReturn(CheckValue("nullableEnum8.Value()", value.Value(), 254U));
            }
            break;
        case 333:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 334:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableEnum8", value));
                VerifyOrReturn(CheckValue("nullableEnum8.Value()", value.Value(), 254U));
            }
            break;
        case 335:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 336:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableEnum8", value));
            }
            break;
        case 337:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 338:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableEnum16", value));
                VerifyOrReturn(CheckValue("nullableEnum16.Value()", value.Value(), 0U));
            }
            break;
        case 339:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 340:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableEnum16", value));
                VerifyOrReturn(CheckValue("nullableEnum16.Value()", value.Value(), 65534U));
            }
            break;
        case 341:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 342:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableEnum16", value));
                VerifyOrReturn(CheckValue("nullableEnum16.Value()", value.Value(), 65534U));
            }
            break;
        case 343:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 344:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableEnum16", value));
            }
            break;
        case 345:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 346:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::UnitTesting::SimpleEnum> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableEnumAttr", value));
                VerifyOrReturn(CheckValue("nullableEnumAttr.Value()", value.Value(), 0U));
            }
            break;
        case 347:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 348:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::UnitTesting::SimpleEnum> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableEnumAttr", value));
                VerifyOrReturn(CheckValue("nullableEnumAttr.Value()", value.Value(), 3U));
            }
            break;
        case 349:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 350:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::UnitTesting::SimpleEnum> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableEnumAttr", value));
                VerifyOrReturn(CheckValue("nullableEnumAttr.Value()", value.Value(), 3U));
                nullableEnumAttr3 = value;
            }
            break;
        case 351:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 352:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::UnitTesting::SimpleEnum> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableEnumAttr", value));
            }
            break;
        case 353:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::UnitTesting::SimpleEnum> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, nullableEnumAttr3));
            }
            break;
        case 354:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::ByteSpan> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableOctetString", value));
                VerifyOrReturn(CheckValueAsString("nullableOctetString.Value()", value.Value(),
                                                  chip::ByteSpan(chip::Uint8::from_const_char(""), 0)));
            }
            break;
        case 355:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 356:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::ByteSpan> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableOctetString", value));
                VerifyOrReturn(CheckValueAsString("nullableOctetString.Value()", value.Value(),
                                                  chip::ByteSpan(chip::Uint8::from_const_char("TestValue"), 9)));
                if (value.IsNull())
                {
                    nullableOctetStrTestValue.SetNull();
                }
                else
                {
                    if (nullableOctetStrTestValueBuffer != nullptr)
                    {
                        chip::Platform::MemoryFree(nullableOctetStrTestValueBuffer);
                    }
                    nullableOctetStrTestValueBuffer = static_cast<uint8_t *>(chip::Platform::MemoryAlloc(value.Value().size()));
                    memcpy(nullableOctetStrTestValueBuffer, value.Value().data(), value.Value().size());
                    nullableOctetStrTestValue.SetNonNull(nullableOctetStrTestValueBuffer, value.Value().size());
                }
            }
            break;
        case 357:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 358:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::ByteSpan> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableOctetString", value));
            }
            break;
        case 359:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 360:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::ByteSpan> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableOctetString", value));
                VerifyOrReturn(CheckValueAsString("nullableOctetString.Value()", value.Value(),
                                                  chip::ByteSpan(chip::Uint8::from_const_char(""), 0)));
            }
            break;
        case 361:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::ByteSpan> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, nullableOctetStrTestValue));
            }
            break;
        case 362:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::CharSpan> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableCharString", value));
                VerifyOrReturn(CheckValueAsString("nullableCharString.Value()", value.Value(), chip::CharSpan("", 0)));
            }
            break;
        case 363:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 364:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::CharSpan> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableCharString", value));
                VerifyOrReturn(CheckValueAsString("nullableCharString.Value()", value.Value(), chip::CharSpan("☉T☉", 7)));
                if (value.IsNull())
                {
                    nullableCharStringSave.SetNull();
                }
                else
                {
                    if (nullableCharStringSaveBuffer != nullptr)
                    {
                        chip::Platform::MemoryFree(nullableCharStringSaveBuffer);
                    }
                    nullableCharStringSaveBuffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.Value().size()));
                    memcpy(nullableCharStringSaveBuffer, value.Value().data(), value.Value().size());
                    nullableCharStringSave.SetNonNull(nullableCharStringSaveBuffer, value.Value().size());
                }
            }
            break;
        case 365:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::CharSpan> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                if (nullableCharStringSave.IsNull())
                {
                    VerifyOrReturn(CheckValueNull("nullableCharString", value));
                }
                else
                {
                    VerifyOrReturn(CheckValueNonNull("nullableCharString", value));
                    VerifyOrReturn(CheckValueAsString("nullableCharString.Value()", value.Value(), nullableCharStringSave.Value()));
                }
            }
            break;
        case 366:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 367:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::CharSpan> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableCharString", value));
            }
            break;
        case 368:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 369:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::CharSpan> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableCharString", value));
                VerifyOrReturn(CheckValueAsString("nullableCharString.Value()", value.Value(), chip::CharSpan("", 0)));
            }
            break;
        case 370:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::CharSpan> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, nullableCharStringSave));
            }
            break;
        case 371:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_ENDPOINT));
            break;
        case 372:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_CLUSTER));
            break;
        case 373:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_VALUE));
            break;
        case 374:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 375:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listInt8u", iter_0, 0));
                    VerifyOrReturn(CheckValue("listInt8u[0]", iter_0.GetValue(), 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listInt8u", iter_0, 1));
                    VerifyOrReturn(CheckValue("listInt8u[1]", iter_0.GetValue(), 2U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listInt8u", iter_0, 2));
                    VerifyOrReturn(CheckValue("listInt8u[2]", iter_0.GetValue(), 3U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listInt8u", iter_0, 3));
                    VerifyOrReturn(CheckValue("listInt8u[3]", iter_0.GetValue(), 4U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("listInt8u", iter_0, 4));
                }
            }
            break;
        case 376:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 377:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listInt8u", iter_0, 0));
                    VerifyOrReturn(CheckValue("listInt8u[0]", iter_0.GetValue(), 5U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listInt8u", iter_0, 1));
                    VerifyOrReturn(CheckValue("listInt8u[1]", iter_0.GetValue(), 6U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listInt8u", iter_0, 2));
                    VerifyOrReturn(CheckValue("listInt8u[2]", iter_0.GetValue(), 7U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listInt8u", iter_0, 3));
                    VerifyOrReturn(CheckValue("listInt8u[3]", iter_0.GetValue(), 8U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("listInt8u", iter_0, 4));
                }
            }
            shouldContinue = true;
            break;
        case 378:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("rangeRestrictedInt8u", value, 70U));
            }
            break;
        case 379:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 380:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 381:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 382:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 383:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("rangeRestrictedInt8u", value, 70U));
            }
            break;
        case 384:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 385:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("rangeRestrictedInt8u", value, 20U));
            }
            break;
        case 386:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 387:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("rangeRestrictedInt8u", value, 100U));
            }
            break;
        case 388:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 389:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("rangeRestrictedInt8u", value, 50U));
            }
            break;
        case 390:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("rangeRestrictedInt16u", value, 200U));
            }
            break;
        case 391:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 392:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 393:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 394:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 395:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("rangeRestrictedInt16u", value, 200U));
            }
            break;
        case 396:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 397:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("rangeRestrictedInt16u", value, 100U));
            }
            break;
        case 398:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 399:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("rangeRestrictedInt16u", value, 1000U));
            }
            break;
        case 400:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 401:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("rangeRestrictedInt16u", value, 500U));
            }
            break;
        case 402:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("rangeRestrictedInt8s", value, -20));
            }
            break;
        case 403:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 404:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 405:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 406:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 407:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("rangeRestrictedInt8s", value, -20));
            }
            break;
        case 408:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 409:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("rangeRestrictedInt8s", value, -40));
            }
            break;
        case 410:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 411:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("rangeRestrictedInt8s", value, 50));
            }
            break;
        case 412:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 413:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("rangeRestrictedInt8s", value, 6));
            }
            break;
        case 414:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("rangeRestrictedInt16s", value, -100));
            }
            break;
        case 415:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 416:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 417:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 418:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 419:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("rangeRestrictedInt16s", value, -100));
            }
            break;
        case 420:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 421:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("rangeRestrictedInt16s", value, -150));
            }
            break;
        case 422:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 423:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("rangeRestrictedInt16s", value, 200));
            }
            break;
        case 424:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 425:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("rangeRestrictedInt16s", value, 7));
            }
            break;
        case 426:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableRangeRestrictedInt8u", value));
                VerifyOrReturn(CheckValue("nullableRangeRestrictedInt8u.Value()", value.Value(), 70U));
            }
            break;
        case 427:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 428:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 429:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 430:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 431:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableRangeRestrictedInt8u", value));
                VerifyOrReturn(CheckValue("nullableRangeRestrictedInt8u.Value()", value.Value(), 70U));
            }
            break;
        case 432:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 433:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableRangeRestrictedInt8u", value));
                VerifyOrReturn(CheckValue("nullableRangeRestrictedInt8u.Value()", value.Value(), 20U));
            }
            break;
        case 434:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 435:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableRangeRestrictedInt8u", value));
                VerifyOrReturn(CheckValue("nullableRangeRestrictedInt8u.Value()", value.Value(), 100U));
            }
            break;
        case 436:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 437:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableRangeRestrictedInt8u", value));
                VerifyOrReturn(CheckValue("nullableRangeRestrictedInt8u.Value()", value.Value(), 50U));
            }
            break;
        case 438:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 439:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableRangeRestrictedInt8u", value));
            }
            break;
        case 440:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableRangeRestrictedInt16u", value));
                VerifyOrReturn(CheckValue("nullableRangeRestrictedInt16u.Value()", value.Value(), 200U));
            }
            break;
        case 441:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 442:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 443:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 444:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 445:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableRangeRestrictedInt16u", value));
                VerifyOrReturn(CheckValue("nullableRangeRestrictedInt16u.Value()", value.Value(), 200U));
            }
            break;
        case 446:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 447:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableRangeRestrictedInt16u", value));
                VerifyOrReturn(CheckValue("nullableRangeRestrictedInt16u.Value()", value.Value(), 100U));
            }
            break;
        case 448:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 449:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableRangeRestrictedInt16u", value));
                VerifyOrReturn(CheckValue("nullableRangeRestrictedInt16u.Value()", value.Value(), 1000U));
            }
            break;
        case 450:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 451:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableRangeRestrictedInt16u", value));
                VerifyOrReturn(CheckValue("nullableRangeRestrictedInt16u.Value()", value.Value(), 500U));
            }
            break;
        case 452:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 453:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableRangeRestrictedInt16u", value));
            }
            break;
        case 454:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableRangeRestrictedInt8s", value));
                VerifyOrReturn(CheckValue("nullableRangeRestrictedInt8s.Value()", value.Value(), -20));
            }
            break;
        case 455:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 456:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 457:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 458:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 459:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableRangeRestrictedInt8s", value));
                VerifyOrReturn(CheckValue("nullableRangeRestrictedInt8s.Value()", value.Value(), -20));
            }
            break;
        case 460:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 461:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableRangeRestrictedInt8s", value));
                VerifyOrReturn(CheckValue("nullableRangeRestrictedInt8s.Value()", value.Value(), -40));
            }
            break;
        case 462:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 463:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableRangeRestrictedInt8s", value));
                VerifyOrReturn(CheckValue("nullableRangeRestrictedInt8s.Value()", value.Value(), 50));
            }
            break;
        case 464:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 465:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableRangeRestrictedInt8s", value));
                VerifyOrReturn(CheckValue("nullableRangeRestrictedInt8s.Value()", value.Value(), 6));
            }
            break;
        case 466:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 467:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableRangeRestrictedInt8s", value));
            }
            break;
        case 468:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableRangeRestrictedInt16s", value));
                VerifyOrReturn(CheckValue("nullableRangeRestrictedInt16s.Value()", value.Value(), -100));
            }
            break;
        case 469:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 470:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 471:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 472:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 473:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableRangeRestrictedInt16s", value));
                VerifyOrReturn(CheckValue("nullableRangeRestrictedInt16s.Value()", value.Value(), -100));
            }
            break;
        case 474:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 475:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableRangeRestrictedInt16s", value));
                VerifyOrReturn(CheckValue("nullableRangeRestrictedInt16s.Value()", value.Value(), -150));
            }
            break;
        case 476:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 477:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableRangeRestrictedInt16s", value));
                VerifyOrReturn(CheckValue("nullableRangeRestrictedInt16s.Value()", value.Value(), 200));
            }
            break;
        case 478:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 479:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableRangeRestrictedInt16s", value));
                VerifyOrReturn(CheckValue("nullableRangeRestrictedInt16s.Value()", value.Value(), 7));
            }
            break;
        case 480:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 481:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableRangeRestrictedInt16s", value));
            }
            break;
        case 482:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_DATA_TYPE));
            break;
        case 483:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 484:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_DATA_TYPE));
            break;
        case 485:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 486:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acceptedCommandList", iter_0, 0));
                    VerifyOrReturn(CheckValue("acceptedCommandList[0]", iter_0.GetValue(), 0UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acceptedCommandList", iter_0, 1));
                    VerifyOrReturn(CheckValue("acceptedCommandList[1]", iter_0.GetValue(), 1UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acceptedCommandList", iter_0, 2));
                    VerifyOrReturn(CheckValue("acceptedCommandList[2]", iter_0.GetValue(), 2UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acceptedCommandList", iter_0, 3));
                    VerifyOrReturn(CheckValue("acceptedCommandList[3]", iter_0.GetValue(), 4UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acceptedCommandList", iter_0, 4));
                    VerifyOrReturn(CheckValue("acceptedCommandList[4]", iter_0.GetValue(), 7UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acceptedCommandList", iter_0, 5));
                    VerifyOrReturn(CheckValue("acceptedCommandList[5]", iter_0.GetValue(), 8UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acceptedCommandList", iter_0, 6));
                    VerifyOrReturn(CheckValue("acceptedCommandList[6]", iter_0.GetValue(), 9UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acceptedCommandList", iter_0, 7));
                    VerifyOrReturn(CheckValue("acceptedCommandList[7]", iter_0.GetValue(), 10UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acceptedCommandList", iter_0, 8));
                    VerifyOrReturn(CheckValue("acceptedCommandList[8]", iter_0.GetValue(), 11UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acceptedCommandList", iter_0, 9));
                    VerifyOrReturn(CheckValue("acceptedCommandList[9]", iter_0.GetValue(), 12UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acceptedCommandList", iter_0, 10));
                    VerifyOrReturn(CheckValue("acceptedCommandList[10]", iter_0.GetValue(), 13UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acceptedCommandList", iter_0, 11));
                    VerifyOrReturn(CheckValue("acceptedCommandList[11]", iter_0.GetValue(), 14UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acceptedCommandList", iter_0, 12));
                    VerifyOrReturn(CheckValue("acceptedCommandList[12]", iter_0.GetValue(), 15UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acceptedCommandList", iter_0, 13));
                    VerifyOrReturn(CheckValue("acceptedCommandList[13]", iter_0.GetValue(), 17UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acceptedCommandList", iter_0, 14));
                    VerifyOrReturn(CheckValue("acceptedCommandList[14]", iter_0.GetValue(), 18UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acceptedCommandList", iter_0, 15));
                    VerifyOrReturn(CheckValue("acceptedCommandList[15]", iter_0.GetValue(), 19UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acceptedCommandList", iter_0, 16));
                    VerifyOrReturn(CheckValue("acceptedCommandList[16]", iter_0.GetValue(), 20UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acceptedCommandList", iter_0, 17));
                    VerifyOrReturn(CheckValue("acceptedCommandList[17]", iter_0.GetValue(), 21UL));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 18));
                }
            }
            break;
        case 487:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("generatedCommandList", iter_0, 0));
                    VerifyOrReturn(CheckValue("generatedCommandList[0]", iter_0.GetValue(), 0UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("generatedCommandList", iter_0, 1));
                    VerifyOrReturn(CheckValue("generatedCommandList[1]", iter_0.GetValue(), 1UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("generatedCommandList", iter_0, 2));
                    VerifyOrReturn(CheckValue("generatedCommandList[2]", iter_0.GetValue(), 4UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("generatedCommandList", iter_0, 3));
                    VerifyOrReturn(CheckValue("generatedCommandList[3]", iter_0.GetValue(), 5UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("generatedCommandList", iter_0, 4));
                    VerifyOrReturn(CheckValue("generatedCommandList[4]", iter_0.GetValue(), 6UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("generatedCommandList", iter_0, 5));
                    VerifyOrReturn(CheckValue("generatedCommandList[5]", iter_0.GetValue(), 8UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("generatedCommandList", iter_0, 6));
                    VerifyOrReturn(CheckValue("generatedCommandList[6]", iter_0.GetValue(), 9UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("generatedCommandList", iter_0, 7));
                    VerifyOrReturn(CheckValue("generatedCommandList[7]", iter_0.GetValue(), 10UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("generatedCommandList", iter_0, 8));
                    VerifyOrReturn(CheckValue("generatedCommandList[8]", iter_0.GetValue(), 11UL));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 9));
                }
            }
            break;
        case 488:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 489:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Structs::SimpleStruct::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("structAttr.a", value.a, 5U));
                VerifyOrReturn(CheckValue("structAttr.b", value.b, true));
                VerifyOrReturn(CheckValue("structAttr.c", value.c, 2U));
                VerifyOrReturn(CheckValueAsString("structAttr.d", value.d, chip::ByteSpan(chip::Uint8::from_const_char("abc"), 3)));
                VerifyOrReturn(CheckValueAsString("structAttr.e", value.e, chip::CharSpan("", 0)));
                VerifyOrReturn(CheckValue("structAttr.f", value.f, 17U));
                VerifyOrReturn(CheckValue("structAttr.g", value.g, 1.5f));
                VerifyOrReturn(CheckValue("structAttr.h", value.h, 3.14159265358979));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Send Test Command");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::Test::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Commands::Test::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Send Test Not Handled Command");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestNotHandled::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Commands::TestNotHandled::Id, value,
                               chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "Send Test Specific Command");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestSpecific::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Commands::TestSpecific::Id, value,
                               chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Send Test Add Arguments Command");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestAddArguments::Type value;
            value.arg1 = 3U;
            value.arg2 = 17U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Commands::TestAddArguments::Id, value,
                               chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "Send failing Test Add Arguments Command");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestAddArguments::Type value;
            value.arg1 = 250U;
            value.arg2 = 6U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Commands::TestAddArguments::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Read attribute BOOLEAN Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Boolean::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Write attribute BOOLEAN True");
            ListFreer listFreer;
            bool value;
            value = 1;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Boolean::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read attribute BOOLEAN True");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Boolean::Id, true,
                                 chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Write attribute BOOLEAN False");
            ListFreer listFreer;
            bool value;
            value = 0;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Boolean::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Read attribute BOOLEAN False");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Boolean::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Read attribute BITMAP8 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap8::Id, true,
                                 chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Write attribute BITMAP8 Max Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap>>(255U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap8::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Read attribute BITMAP8 Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap8::Id, true,
                                 chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Write attribute BITMAP8 Min Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap>>(0U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap8::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Read attribute BITMAP8 Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap8::Id, true,
                                 chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Read attribute BITMAP16 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap16::Id, true,
                                 chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Write attribute BITMAP16 Max Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap>>(65535U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap16::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Read attribute BITMAP16 Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap16::Id, true,
                                 chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Write attribute BITMAP16 Min Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap>>(0U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap16::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Read attribute BITMAP16 Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap16::Id, true,
                                 chip::NullOptional);
        }
        case 21: {
            LogStep(21, "Read attribute BITMAP32 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap32::Id, true,
                                 chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Write attribute BITMAP32 Max Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap>>(4294967295UL);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap32::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "Read attribute BITMAP32 Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap32::Id, true,
                                 chip::NullOptional);
        }
        case 24: {
            LogStep(24, "Write attribute BITMAP32 Min Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap>>(0UL);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap32::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 25: {
            LogStep(25, "Read attribute BITMAP32 Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap32::Id, true,
                                 chip::NullOptional);
        }
        case 26: {
            LogStep(26, "Read attribute BITMAP64 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap64::Id, true,
                                 chip::NullOptional);
        }
        case 27: {
            LogStep(27, "Write attribute BITMAP64 Max Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap>>(18446744073709551615ULL);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap64::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 28: {
            LogStep(28, "Read attribute BITMAP64 Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap64::Id, true,
                                 chip::NullOptional);
        }
        case 29: {
            LogStep(29, "Write attribute BITMAP64 Min Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap>>(0ULL);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap64::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 30: {
            LogStep(30, "Read attribute BITMAP64 Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap64::Id, true,
                                 chip::NullOptional);
        }
        case 31: {
            LogStep(31, "Read attribute INT8U Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int8u::Id, true,
                                 chip::NullOptional);
        }
        case 32: {
            LogStep(32, "Write attribute INT8U Max Value");
            ListFreer listFreer;
            uint8_t value;
            value = 255U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int8u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 33: {
            LogStep(33, "Read attribute INT8U Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int8u::Id, true,
                                 chip::NullOptional);
        }
        case 34: {
            LogStep(34, "Write attribute INT8U Min Value");
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int8u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 35: {
            LogStep(35, "Read attribute INT8U Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int8u::Id, true,
                                 chip::NullOptional);
        }
        case 36: {
            LogStep(36, "Read attribute INT16U Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int16u::Id, true,
                                 chip::NullOptional);
        }
        case 37: {
            LogStep(37, "Write attribute INT16U Max Value");
            ListFreer listFreer;
            uint16_t value;
            value = 65535U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int16u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 38: {
            LogStep(38, "Read attribute INT16U Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int16u::Id, true,
                                 chip::NullOptional);
        }
        case 39: {
            LogStep(39, "Write attribute INT16U Min Value");
            ListFreer listFreer;
            uint16_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int16u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 40: {
            LogStep(40, "Read attribute INT16U Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int16u::Id, true,
                                 chip::NullOptional);
        }
        case 41: {
            LogStep(41, "Read attribute INT32U Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32u::Id, true,
                                 chip::NullOptional);
        }
        case 42: {
            LogStep(42, "Write attribute INT32U Max Value");
            ListFreer listFreer;
            uint32_t value;
            value = 4294967295UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 43: {
            LogStep(43, "Read attribute INT32U Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32u::Id, true,
                                 chip::NullOptional);
        }
        case 44: {
            LogStep(44, "Write attribute INT32U Min Value");
            ListFreer listFreer;
            uint32_t value;
            value = 0UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 45: {
            LogStep(45, "Read attribute INT32U Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32u::Id, true,
                                 chip::NullOptional);
        }
        case 46: {
            LogStep(46, "Read attribute INT64U Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int64u::Id, true,
                                 chip::NullOptional);
        }
        case 47: {
            LogStep(47, "Write attribute INT64U Max Value");
            ListFreer listFreer;
            uint64_t value;
            value = 18446744073709551615ULL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int64u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 48: {
            LogStep(48, "Read attribute INT64U Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int64u::Id, true,
                                 chip::NullOptional);
        }
        case 49: {
            LogStep(49, "Write attribute INT64U Min Value");
            ListFreer listFreer;
            uint64_t value;
            value = 0ULL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int64u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 50: {
            LogStep(50, "Read attribute INT64U Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int64u::Id, true,
                                 chip::NullOptional);
        }
        case 51: {
            LogStep(51, "Read attribute INT8S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int8s::Id, true,
                                 chip::NullOptional);
        }
        case 52: {
            LogStep(52, "Write attribute INT8S Max Value");
            ListFreer listFreer;
            int8_t value;
            value = 127;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int8s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 53: {
            LogStep(53, "Read attribute INT8S Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int8s::Id, true,
                                 chip::NullOptional);
        }
        case 54: {
            LogStep(54, "Write attribute INT8S Min Value");
            ListFreer listFreer;
            int8_t value;
            value = -128;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int8s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 55: {
            LogStep(55, "Read attribute INT8S Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int8s::Id, true,
                                 chip::NullOptional);
        }
        case 56: {
            LogStep(56, "Write attribute INT8S Default Value");
            ListFreer listFreer;
            int8_t value;
            value = 0;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int8s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 57: {
            LogStep(57, "Read attribute INT8S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int8s::Id, true,
                                 chip::NullOptional);
        }
        case 58: {
            LogStep(58, "Read attribute INT16S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int16s::Id, true,
                                 chip::NullOptional);
        }
        case 59: {
            LogStep(59, "Write attribute INT16S Max Value");
            ListFreer listFreer;
            int16_t value;
            value = 32767;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int16s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 60: {
            LogStep(60, "Read attribute INT16S Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int16s::Id, true,
                                 chip::NullOptional);
        }
        case 61: {
            LogStep(61, "Write attribute INT16S Min Value");
            ListFreer listFreer;
            int16_t value;
            value = -32768;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int16s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 62: {
            LogStep(62, "Read attribute INT16S Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int16s::Id, true,
                                 chip::NullOptional);
        }
        case 63: {
            LogStep(63, "Write attribute INT16S Default Value");
            ListFreer listFreer;
            int16_t value;
            value = 0;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int16s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 64: {
            LogStep(64, "Read attribute INT16S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int16s::Id, true,
                                 chip::NullOptional);
        }
        case 65: {
            LogStep(65, "Read attribute INT32S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32s::Id, true,
                                 chip::NullOptional);
        }
        case 66: {
            LogStep(66, "Write attribute INT32S Max Value");
            ListFreer listFreer;
            int32_t value;
            value = 2147483647L;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 67: {
            LogStep(67, "Read attribute INT32S Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32s::Id, true,
                                 chip::NullOptional);
        }
        case 68: {
            LogStep(68, "Write attribute INT32S Min Value");
            ListFreer listFreer;
            int32_t value;
            value = -2147483648L;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 69: {
            LogStep(69, "Read attribute INT32S Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32s::Id, true,
                                 chip::NullOptional);
        }
        case 70: {
            LogStep(70, "Write attribute INT32S Default Value");
            ListFreer listFreer;
            int32_t value;
            value = 0L;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 71: {
            LogStep(71, "Read attribute INT32S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32s::Id, true,
                                 chip::NullOptional);
        }
        case 72: {
            LogStep(72, "Read attribute INT64S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int64s::Id, true,
                                 chip::NullOptional);
        }
        case 73: {
            LogStep(73, "Write attribute INT64S Max Value");
            ListFreer listFreer;
            int64_t value;
            value = 9223372036854775807LL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int64s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 74: {
            LogStep(74, "Read attribute INT64S Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int64s::Id, true,
                                 chip::NullOptional);
        }
        case 75: {
            LogStep(75, "Write attribute INT64S Min Value");
            ListFreer listFreer;
            int64_t value;
            value = -9223372036854775807LL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int64s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 76: {
            LogStep(76, "Read attribute INT64S Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int64s::Id, true,
                                 chip::NullOptional);
        }
        case 77: {
            LogStep(77, "Write attribute INT64S Default Value");
            ListFreer listFreer;
            int64_t value;
            value = 0LL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int64s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 78: {
            LogStep(78, "Read attribute INT64S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int64s::Id, true,
                                 chip::NullOptional);
        }
        case 79: {
            LogStep(79, "Read attribute SINGLE Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::FloatSingle::Id, true,
                                 chip::NullOptional);
        }
        case 80: {
            LogStep(80, "Write attribute SINGLE medium Value");
            ListFreer listFreer;
            float value;
            value = 0.1f;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::FloatSingle::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 81: {
            LogStep(81, "Read attribute SINGLE medium Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::FloatSingle::Id, true,
                                 chip::NullOptional);
        }
        case 82: {
            LogStep(82, "Write attribute SINGLE large Value");
            ListFreer listFreer;
            float value;
            value = 17000000000.0f;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::FloatSingle::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 83: {
            LogStep(83, "Read attribute SINGLE large Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::FloatSingle::Id, true,
                                 chip::NullOptional);
        }
        case 84: {
            LogStep(84, "Write attribute SINGLE small Value");
            ListFreer listFreer;
            float value;
            value = 1.7e-10f;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::FloatSingle::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 85: {
            LogStep(85, "Read attribute SINGLE small Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::FloatSingle::Id, true,
                                 chip::NullOptional);
        }
        case 86: {
            LogStep(86, "Write attribute SINGLE Default Value");
            ListFreer listFreer;
            float value;
            value = 0.0f;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::FloatSingle::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 87: {
            LogStep(87, "Read attribute SINGLE Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::FloatSingle::Id, true,
                                 chip::NullOptional);
        }
        case 88: {
            LogStep(88, "Read attribute DOUBLE Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::FloatDouble::Id, true,
                                 chip::NullOptional);
        }
        case 89: {
            LogStep(89, "Write attribute DOUBLE medium Value");
            ListFreer listFreer;
            double value;
            value = 0.1234567890123;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::FloatDouble::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 90: {
            LogStep(90, "Read attribute DOUBLE medium Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::FloatDouble::Id, true,
                                 chip::NullOptional);
        }
        case 91: {
            LogStep(91, "Write attribute DOUBLE large Value");
            ListFreer listFreer;
            double value;
            value = 1.7e+200;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::FloatDouble::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 92: {
            LogStep(92, "Read attribute DOUBLE large Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::FloatDouble::Id, true,
                                 chip::NullOptional);
        }
        case 93: {
            LogStep(93, "Write attribute DOUBLE small Value");
            ListFreer listFreer;
            double value;
            value = 1.7e-200;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::FloatDouble::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 94: {
            LogStep(94, "Read attribute DOUBLE small Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::FloatDouble::Id, true,
                                 chip::NullOptional);
        }
        case 95: {
            LogStep(95, "Write attribute DOUBLE Default Value");
            ListFreer listFreer;
            double value;
            value = 0;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::FloatDouble::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 96: {
            LogStep(96, "Read attribute DOUBLE Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::FloatDouble::Id, true,
                                 chip::NullOptional);
        }
        case 97: {
            LogStep(97, "Read attribute ENUM8 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Enum8::Id, true,
                                 chip::NullOptional);
        }
        case 98: {
            LogStep(98, "Write attribute ENUM8 Max Value");
            ListFreer listFreer;
            uint8_t value;
            value = 255U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Enum8::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 99: {
            LogStep(99, "Read attribute ENUM8 Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Enum8::Id, true,
                                 chip::NullOptional);
        }
        case 100: {
            LogStep(100, "Write attribute ENUM8 Min Value");
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Enum8::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 101: {
            LogStep(101, "Read attribute ENUM8 Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Enum8::Id, true,
                                 chip::NullOptional);
        }
        case 102: {
            LogStep(102, "Read attribute ENUM16 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Enum16::Id, true,
                                 chip::NullOptional);
        }
        case 103: {
            LogStep(103, "Write attribute ENUM16 Max Value");
            ListFreer listFreer;
            uint16_t value;
            value = 65535U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Enum16::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 104: {
            LogStep(104, "Read attribute ENUM16 Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Enum16::Id, true,
                                 chip::NullOptional);
        }
        case 105: {
            LogStep(105, "Write attribute ENUM16 Min Value");
            ListFreer listFreer;
            uint16_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Enum16::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 106: {
            LogStep(106, "Read attribute ENUM16 Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Enum16::Id, true,
                                 chip::NullOptional);
        }
        case 107: {
            LogStep(107, "Read attribute OCTET_STRING Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::OctetString::Id, true,
                                 chip::NullOptional);
        }
        case 108: {
            LogStep(108, "Write attribute OCTET_STRING with embedded null");
            ListFreer listFreer;
            chip::ByteSpan value;
            value = chip::ByteSpan(chip::Uint8::from_const_char("Tes\000ti\000nggarbage: not in length on purpose"), 9);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::OctetString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 109: {
            LogStep(109, "Read attribute OCTET_STRING with embedded null");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::OctetString::Id, true,
                                 chip::NullOptional);
        }
        case 110: {
            LogStep(110, "Write attribute OCTET_STRING with hex: format");
            ListFreer listFreer;
            chip::ByteSpan value;
            value = chip::ByteSpan(chip::Uint8::from_const_char("\x00\x01\x02\x03\x04\x05garbage: not in length on purpose"), 6);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::OctetString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 111: {
            LogStep(111, "Read attribute OCTET_STRING with hex: format");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::OctetString::Id, true,
                                 chip::NullOptional);
        }
        case 112: {
            LogStep(112, "Write attribute OCTET_STRING with weird chars");
            ListFreer listFreer;
            chip::ByteSpan value;
            value = chip::ByteSpan(chip::Uint8::from_const_char("\015\012\377\042\240garbage: not in length on purpose"), 5);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::OctetString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 113: {
            LogStep(113, "Read attribute OCTET_STRING with weird chars");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::OctetString::Id, true,
                                 chip::NullOptional);
        }
        case 114: {
            LogStep(114, "Write attribute OCTET_STRING");
            ListFreer listFreer;
            chip::ByteSpan value;
            value = chip::ByteSpan(chip::Uint8::from_const_char("TestValuegarbage: not in length on purpose"), 9);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::OctetString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 115: {
            LogStep(115, "Read attribute OCTET_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::OctetString::Id, true,
                                 chip::NullOptional);
        }
        case 116: {
            LogStep(116, "Write attribute OCTET_STRING");
            ListFreer listFreer;
            chip::ByteSpan value;
            value = chip::ByteSpan(chip::Uint8::from_const_char("TestValueLongerThan10garbage: not in length on purpose"), 21);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::OctetString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 117: {
            LogStep(117, "Read attribute OCTET_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::OctetString::Id, true,
                                 chip::NullOptional);
        }
        case 118: {
            LogStep(118, "Write attribute OCTET_STRING");
            ListFreer listFreer;
            chip::ByteSpan value;
            value = chip::ByteSpan(chip::Uint8::from_const_char("garbage: not in length on purpose"), 0);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::OctetString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 119: {
            LogStep(119, "Read attribute LONG_OCTET_STRING Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::LongOctetString::Id,
                                 true, chip::NullOptional);
        }
        case 120: {
            LogStep(120, "Write attribute LONG_OCTET_STRING");
            ListFreer listFreer;
            chip::ByteSpan value;
            value = chip::ByteSpan(
                chip::Uint8::from_const_char("1111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
                                             "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
                                             "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
                                             "111111111111111111111111111111111111111111111garbage: not in length on purpose"),
                300);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::LongOctetString::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 121: {
            LogStep(121, "Read attribute LONG_OCTET_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::LongOctetString::Id,
                                 true, chip::NullOptional);
        }
        case 122: {
            LogStep(122, "Write attribute LONG_OCTET_STRING");
            ListFreer listFreer;
            chip::ByteSpan value;
            value = chip::ByteSpan(chip::Uint8::from_const_char("garbage: not in length on purpose"), 0);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::LongOctetString::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 123: {
            LogStep(123, "Read attribute CHAR_STRING Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, true,
                                 chip::NullOptional);
        }
        case 124: {
            LogStep(124, "Write attribute CHAR_STRING");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("☉T☉garbage: not in length on purpose", 7);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 125: {
            LogStep(125, "Read attribute CHAR_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, true,
                                 chip::NullOptional);
        }
        case 126: {
            LogStep(126, "Write attribute CHAR_STRING - Value too long");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("☉TestValueLongerThan10☉garbage: not in length on purpose", 27);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 127: {
            LogStep(127, "Read attribute CHAR_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, true,
                                 chip::NullOptional);
        }
        case 128: {
            LogStep(128, "Write attribute CHAR_STRING - Empty");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("garbage: not in length on purpose", 0);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 129: {
            LogStep(129, "Read attribute LONG_CHAR_STRING Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::LongCharString::Id, true,
                                 chip::NullOptional);
        }
        case 130: {
            LogStep(130, "Write attribute LONG_CHAR_STRING");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>(
                "☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉"
                "☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉"
                "☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉garbage: not in length on purpose",
                900);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::LongCharString::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 131: {
            LogStep(131, "Read attribute LONG_CHAR_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::LongCharString::Id, true,
                                 chip::NullOptional);
        }
        case 132: {
            LogStep(132, "Write attribute LONG_CHAR_STRING");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("garbage: not in length on purpose", 0);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::LongCharString::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 133: {
            LogStep(133, "Read attribute LIST_LONG_OCTET_STRING (for chunked read)");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::ListLongOctetString::Id,
                                 true, chip::NullOptional);
        }
        case 134: {
            LogStep(134, "Write attribute LIST_LONG_OCTET_STRING (for chunked write)");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::ByteSpan> value;

            {
                auto * listHolder_0 = new ListHolder<chip::ByteSpan>(5);
                listFreer.add(listHolder_0);
                listHolder_0->mList[0] = chip::ByteSpan(
                    chip::Uint8::from_const_char(
                        "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789"
                        "abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123"
                        "456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                        "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                        "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdefgarbage: not in "
                        "length on purpose"),
                    512);
                listHolder_0->mList[1] = chip::ByteSpan(
                    chip::Uint8::from_const_char(
                        "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789"
                        "abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123"
                        "456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                        "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                        "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdefgarbage: not in "
                        "length on purpose"),
                    512);
                listHolder_0->mList[2] = chip::ByteSpan(
                    chip::Uint8::from_const_char(
                        "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789"
                        "abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123"
                        "456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                        "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                        "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdefgarbage: not in "
                        "length on purpose"),
                    512);
                listHolder_0->mList[3] = chip::ByteSpan(
                    chip::Uint8::from_const_char(
                        "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789"
                        "abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123"
                        "456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                        "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                        "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdefgarbage: not in "
                        "length on purpose"),
                    512);
                listHolder_0->mList[4] = chip::ByteSpan(
                    chip::Uint8::from_const_char(
                        "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789"
                        "abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123"
                        "456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                        "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                        "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdefgarbage: not in "
                        "length on purpose"),
                    512);
                value = chip::app::DataModel::List<chip::ByteSpan>(listHolder_0->mList, 5);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::ListLongOctetString::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 135: {
            LogStep(135, "Read attribute LIST_LONG_OCTET_STRING (for chunked read)");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::ListLongOctetString::Id,
                                 true, chip::NullOptional);
        }
        case 136: {
            LogStep(136, "Read attribute EPOCH_US Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::EpochUs::Id, true,
                                 chip::NullOptional);
        }
        case 137: {
            LogStep(137, "Write attribute EPOCH_US Max Value");
            ListFreer listFreer;
            uint64_t value;
            value = 18446744073709551615ULL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::EpochUs::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 138: {
            LogStep(138, "Read attribute EPOCH_US Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::EpochUs::Id, true,
                                 chip::NullOptional);
        }
        case 139: {
            LogStep(139, "Write attribute EPOCH_US Min Value");
            ListFreer listFreer;
            uint64_t value;
            value = 0ULL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::EpochUs::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 140: {
            LogStep(140, "Read attribute EPOCH_US Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::EpochUs::Id, true,
                                 chip::NullOptional);
        }
        case 141: {
            LogStep(141, "Read attribute EPOCH_S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::EpochS::Id, true,
                                 chip::NullOptional);
        }
        case 142: {
            LogStep(142, "Write attribute EPOCH_S Max Value");
            ListFreer listFreer;
            uint32_t value;
            value = 4294967295UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::EpochS::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 143: {
            LogStep(143, "Read attribute EPOCH_S Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::EpochS::Id, true,
                                 chip::NullOptional);
        }
        case 144: {
            LogStep(144, "Write attribute EPOCH_S Min Value");
            ListFreer listFreer;
            uint32_t value;
            value = 0UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::EpochS::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 145: {
            LogStep(145, "Read attribute EPOCH_S Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::EpochS::Id, true,
                                 chip::NullOptional);
        }
        case 146: {
            LogStep(146, "Read attribute UNSUPPORTED");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Unsupported::Id, true,
                                 chip::NullOptional);
        }
        case 147: {
            LogStep(147, "Writeattribute UNSUPPORTED");
            ListFreer listFreer;
            bool value;
            value = 0;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Unsupported::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 148: {
            LogStep(148, "Send Test Command to unsupported endpoint");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::Test::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(200), UnitTesting::Id, UnitTesting::Commands::Test::Id, value,
                               chip::NullOptional

            );
        }
        case 149: {
            LogStep(149, "Send Test Command to unsupported cluster");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::Test::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), UnitTesting::Id, UnitTesting::Commands::Test::Id, value,
                               chip::NullOptional

            );
        }
        case 150: {
            LogStep(150, "Read attribute vendor_id Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::VendorId::Id, true,
                                 chip::NullOptional);
        }
        case 151: {
            LogStep(151, "Write attribute vendor_id");
            ListFreer listFreer;
            chip::VendorId value;
            value = static_cast<chip::VendorId>(17);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::VendorId::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 152: {
            LogStep(152, "Read attribute vendor_id");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::VendorId::Id, true,
                                 chip::NullOptional);
        }
        case 153: {
            LogStep(153, "Restore attribute vendor_id");
            ListFreer listFreer;
            chip::VendorId value;
            value = static_cast<chip::VendorId>(0);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::VendorId::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 154: {
            LogStep(154, "Send a command with a vendor_id and enum");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestEnumsRequest::Type value;
            value.arg1 = static_cast<chip::VendorId>(20003);
            value.arg2 = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(1);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Commands::TestEnumsRequest::Id, value,
                               chip::NullOptional

            );
        }
        case 155: {
            LogStep(155, "Send a command with a vendor_id and invalid enum");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestEnumsRequest::Type value;
            value.arg1 = static_cast<chip::VendorId>(20003);
            value.arg2 = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(101);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Commands::TestEnumsRequest::Id, value,
                               chip::NullOptional

            );
        }
        case 156: {
            LogStep(156, "Send Test Command With Struct Argument and arg1.b is true");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestStructArgumentRequest::Type value;

            value.arg1.a = 0U;
            value.arg1.b = true;
            value.arg1.c = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(2);
            value.arg1.d = chip::ByteSpan(chip::Uint8::from_const_char("octet_stringgarbage: not in length on purpose"), 12);
            value.arg1.e = chip::Span<const char>("char_stringgarbage: not in length on purpose", 11);
            value.arg1.f = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::SimpleBitmap>>(1U);
            value.arg1.g = 0.0f;
            value.arg1.h = 0;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                               UnitTesting::Commands::TestStructArgumentRequest::Id, value, chip::NullOptional

            );
        }
        case 157: {
            LogStep(157, "Send Test Command With Struct Argument and arg1.b is false");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestStructArgumentRequest::Type value;

            value.arg1.a = 0U;
            value.arg1.b = false;
            value.arg1.c = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(2);
            value.arg1.d = chip::ByteSpan(chip::Uint8::from_const_char("octet_stringgarbage: not in length on purpose"), 12);
            value.arg1.e = chip::Span<const char>("char_stringgarbage: not in length on purpose", 11);
            value.arg1.f = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::SimpleBitmap>>(1U);
            value.arg1.g = 0.0f;
            value.arg1.h = 0;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                               UnitTesting::Commands::TestStructArgumentRequest::Id, value, chip::NullOptional

            );
        }
        case 158: {
            LogStep(158, "Send Test Command With Nested Struct Argument and arg1.c.b is true");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestNestedStructArgumentRequest::Type value;

            value.arg1.a = 0U;
            value.arg1.b = true;

            value.arg1.c.a = 0U;
            value.arg1.c.b = true;
            value.arg1.c.c = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(2);
            value.arg1.c.d = chip::ByteSpan(chip::Uint8::from_const_char("octet_stringgarbage: not in length on purpose"), 12);
            value.arg1.c.e = chip::Span<const char>("char_stringgarbage: not in length on purpose", 11);
            value.arg1.c.f = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::SimpleBitmap>>(1U);
            value.arg1.c.g = 0.0f;
            value.arg1.c.h = 0;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                               UnitTesting::Commands::TestNestedStructArgumentRequest::Id, value, chip::NullOptional

            );
        }
        case 159: {
            LogStep(159, "Send Test Command With Nested Struct Argument arg1.c.b is false");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestNestedStructArgumentRequest::Type value;

            value.arg1.a = 0U;
            value.arg1.b = true;

            value.arg1.c.a = 0U;
            value.arg1.c.b = false;
            value.arg1.c.c = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(2);
            value.arg1.c.d = chip::ByteSpan(chip::Uint8::from_const_char("octet_stringgarbage: not in length on purpose"), 12);
            value.arg1.c.e = chip::Span<const char>("char_stringgarbage: not in length on purpose", 11);
            value.arg1.c.f = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::SimpleBitmap>>(1U);
            value.arg1.c.g = 0.0f;
            value.arg1.c.h = 0;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                               UnitTesting::Commands::TestNestedStructArgumentRequest::Id, value, chip::NullOptional

            );
        }
        case 160: {
            LogStep(160, "Send Test Command With Nested Struct List Argument and all fields b of arg1.d are true");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestNestedStructListArgumentRequest::Type value;

            value.arg1.a = 0U;
            value.arg1.b = true;

            value.arg1.c.a = 0U;
            value.arg1.c.b = true;
            value.arg1.c.c = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(2);
            value.arg1.c.d = chip::ByteSpan(chip::Uint8::from_const_char("octet_stringgarbage: not in length on purpose"), 12);
            value.arg1.c.e = chip::Span<const char>("char_stringgarbage: not in length on purpose", 11);
            value.arg1.c.f = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::SimpleBitmap>>(1U);
            value.arg1.c.g = 0.0f;
            value.arg1.c.h = 0;

            {
                auto * listHolder_1 = new ListHolder<chip::app::Clusters::UnitTesting::Structs::SimpleStruct::Type>(2);
                listFreer.add(listHolder_1);

                listHolder_1->mList[0].a = 1U;
                listHolder_1->mList[0].b = true;
                listHolder_1->mList[0].c = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(3);
                listHolder_1->mList[0].d =
                    chip::ByteSpan(chip::Uint8::from_const_char("nested_octet_stringgarbage: not in length on purpose"), 19);
                listHolder_1->mList[0].e = chip::Span<const char>("nested_char_stringgarbage: not in length on purpose", 18);
                listHolder_1->mList[0].f = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::SimpleBitmap>>(1U);
                listHolder_1->mList[0].g = 0.0f;
                listHolder_1->mList[0].h = 0;

                listHolder_1->mList[1].a = 2U;
                listHolder_1->mList[1].b = true;
                listHolder_1->mList[1].c = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(3);
                listHolder_1->mList[1].d =
                    chip::ByteSpan(chip::Uint8::from_const_char("nested_octet_stringgarbage: not in length on purpose"), 19);
                listHolder_1->mList[1].e = chip::Span<const char>("nested_char_stringgarbage: not in length on purpose", 18);
                listHolder_1->mList[1].f = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::SimpleBitmap>>(1U);
                listHolder_1->mList[1].g = 0.0f;
                listHolder_1->mList[1].h = 0;

                value.arg1.d = chip::app::DataModel::List<chip::app::Clusters::UnitTesting::Structs::SimpleStruct::Type>(
                    listHolder_1->mList, 2);
            }

            {
                auto * listHolder_1 = new ListHolder<uint32_t>(3);
                listFreer.add(listHolder_1);
                listHolder_1->mList[0] = 1UL;
                listHolder_1->mList[1] = 2UL;
                listHolder_1->mList[2] = 3UL;
                value.arg1.e           = chip::app::DataModel::List<uint32_t>(listHolder_1->mList, 3);
            }

            {
                auto * listHolder_1 = new ListHolder<chip::ByteSpan>(3);
                listFreer.add(listHolder_1);
                listHolder_1->mList[0] =
                    chip::ByteSpan(chip::Uint8::from_const_char("octet_string_1garbage: not in length on purpose"), 14);
                listHolder_1->mList[1] =
                    chip::ByteSpan(chip::Uint8::from_const_char("octect_string_2garbage: not in length on purpose"), 15);
                listHolder_1->mList[2] =
                    chip::ByteSpan(chip::Uint8::from_const_char("octet_string_3garbage: not in length on purpose"), 14);
                value.arg1.f = chip::app::DataModel::List<chip::ByteSpan>(listHolder_1->mList, 3);
            }

            {
                auto * listHolder_1 = new ListHolder<uint8_t>(2);
                listFreer.add(listHolder_1);
                listHolder_1->mList[0] = 0U;
                listHolder_1->mList[1] = 255U;
                value.arg1.g           = chip::app::DataModel::List<uint8_t>(listHolder_1->mList, 2);
            }

            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                               UnitTesting::Commands::TestNestedStructListArgumentRequest::Id, value, chip::NullOptional

            );
        }
        case 161: {
            LogStep(161, "Send Test Command With Nested Struct List Argument and some fields b of arg1.d are false");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestNestedStructListArgumentRequest::Type value;

            value.arg1.a = 0U;
            value.arg1.b = true;

            value.arg1.c.a = 0U;
            value.arg1.c.b = true;
            value.arg1.c.c = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(2);
            value.arg1.c.d = chip::ByteSpan(chip::Uint8::from_const_char("octet_stringgarbage: not in length on purpose"), 12);
            value.arg1.c.e = chip::Span<const char>("char_stringgarbage: not in length on purpose", 11);
            value.arg1.c.f = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::SimpleBitmap>>(1U);
            value.arg1.c.g = 0.0f;
            value.arg1.c.h = 0;

            {
                auto * listHolder_1 = new ListHolder<chip::app::Clusters::UnitTesting::Structs::SimpleStruct::Type>(2);
                listFreer.add(listHolder_1);

                listHolder_1->mList[0].a = 1U;
                listHolder_1->mList[0].b = true;
                listHolder_1->mList[0].c = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(3);
                listHolder_1->mList[0].d =
                    chip::ByteSpan(chip::Uint8::from_const_char("nested_octet_stringgarbage: not in length on purpose"), 19);
                listHolder_1->mList[0].e = chip::Span<const char>("nested_char_stringgarbage: not in length on purpose", 18);
                listHolder_1->mList[0].f = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::SimpleBitmap>>(1U);
                listHolder_1->mList[0].g = 0.0f;
                listHolder_1->mList[0].h = 0;

                listHolder_1->mList[1].a = 2U;
                listHolder_1->mList[1].b = false;
                listHolder_1->mList[1].c = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(3);
                listHolder_1->mList[1].d =
                    chip::ByteSpan(chip::Uint8::from_const_char("nested_octet_stringgarbage: not in length on purpose"), 19);
                listHolder_1->mList[1].e = chip::Span<const char>("nested_char_stringgarbage: not in length on purpose", 18);
                listHolder_1->mList[1].f = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::SimpleBitmap>>(1U);
                listHolder_1->mList[1].g = 0.0f;
                listHolder_1->mList[1].h = 0;

                value.arg1.d = chip::app::DataModel::List<chip::app::Clusters::UnitTesting::Structs::SimpleStruct::Type>(
                    listHolder_1->mList, 2);
            }

            {
                auto * listHolder_1 = new ListHolder<uint32_t>(3);
                listFreer.add(listHolder_1);
                listHolder_1->mList[0] = 1UL;
                listHolder_1->mList[1] = 2UL;
                listHolder_1->mList[2] = 3UL;
                value.arg1.e           = chip::app::DataModel::List<uint32_t>(listHolder_1->mList, 3);
            }

            {
                auto * listHolder_1 = new ListHolder<chip::ByteSpan>(3);
                listFreer.add(listHolder_1);
                listHolder_1->mList[0] =
                    chip::ByteSpan(chip::Uint8::from_const_char("octet_string_1garbage: not in length on purpose"), 14);
                listHolder_1->mList[1] =
                    chip::ByteSpan(chip::Uint8::from_const_char("octect_string_2garbage: not in length on purpose"), 15);
                listHolder_1->mList[2] =
                    chip::ByteSpan(chip::Uint8::from_const_char("octet_string_3garbage: not in length on purpose"), 14);
                value.arg1.f = chip::app::DataModel::List<chip::ByteSpan>(listHolder_1->mList, 3);
            }

            {
                auto * listHolder_1 = new ListHolder<uint8_t>(2);
                listFreer.add(listHolder_1);
                listHolder_1->mList[0] = 0U;
                listHolder_1->mList[1] = 255U;
                value.arg1.g           = chip::app::DataModel::List<uint8_t>(listHolder_1->mList, 2);
            }

            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                               UnitTesting::Commands::TestNestedStructListArgumentRequest::Id, value, chip::NullOptional

            );
        }
        case 162: {
            LogStep(162, "Send Test Command With Struct Argument and see what we get back");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::SimpleStructEchoRequest::Type value;

            value.arg1.a = 17U;
            value.arg1.b = false;
            value.arg1.c = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(2);
            value.arg1.d = chip::ByteSpan(chip::Uint8::from_const_char("octet_stringgarbage: not in length on purpose"), 12);
            value.arg1.e = chip::Span<const char>("char_stringgarbage: not in length on purpose", 11);
            value.arg1.f = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::SimpleBitmap>>(1U);
            value.arg1.g = 0.1f;
            value.arg1.h = 0.1;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Commands::SimpleStructEchoRequest::Id,
                               value, chip::NullOptional

            );
        }
        case 163: {
            LogStep(163, "Send Test Command With List of INT8U and none of them is set to 0");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestListInt8UArgumentRequest::Type value;

            {
                auto * listHolder_0 = new ListHolder<uint8_t>(9);
                listFreer.add(listHolder_0);
                listHolder_0->mList[0] = 1U;
                listHolder_0->mList[1] = 2U;
                listHolder_0->mList[2] = 3U;
                listHolder_0->mList[3] = 4U;
                listHolder_0->mList[4] = 5U;
                listHolder_0->mList[5] = 6U;
                listHolder_0->mList[6] = 7U;
                listHolder_0->mList[7] = 8U;
                listHolder_0->mList[8] = 9U;
                value.arg1             = chip::app::DataModel::List<uint8_t>(listHolder_0->mList, 9);
            }
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                               UnitTesting::Commands::TestListInt8UArgumentRequest::Id, value, chip::NullOptional

            );
        }
        case 164: {
            LogStep(164, "Send Test Command With List of INT8U and one of them is set to 0");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestListInt8UArgumentRequest::Type value;

            {
                auto * listHolder_0 = new ListHolder<uint8_t>(10);
                listFreer.add(listHolder_0);
                listHolder_0->mList[0] = 1U;
                listHolder_0->mList[1] = 2U;
                listHolder_0->mList[2] = 3U;
                listHolder_0->mList[3] = 4U;
                listHolder_0->mList[4] = 5U;
                listHolder_0->mList[5] = 6U;
                listHolder_0->mList[6] = 7U;
                listHolder_0->mList[7] = 8U;
                listHolder_0->mList[8] = 9U;
                listHolder_0->mList[9] = 0U;
                value.arg1             = chip::app::DataModel::List<uint8_t>(listHolder_0->mList, 10);
            }
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                               UnitTesting::Commands::TestListInt8UArgumentRequest::Id, value, chip::NullOptional

            );
        }
        case 165: {
            LogStep(165, "Send Test Command With List of INT8U and get it reversed");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestListInt8UReverseRequest::Type value;

            {
                auto * listHolder_0 = new ListHolder<uint8_t>(9);
                listFreer.add(listHolder_0);
                listHolder_0->mList[0] = 1U;
                listHolder_0->mList[1] = 2U;
                listHolder_0->mList[2] = 3U;
                listHolder_0->mList[3] = 4U;
                listHolder_0->mList[4] = 5U;
                listHolder_0->mList[5] = 6U;
                listHolder_0->mList[6] = 7U;
                listHolder_0->mList[7] = 8U;
                listHolder_0->mList[8] = 9U;
                value.arg1             = chip::app::DataModel::List<uint8_t>(listHolder_0->mList, 9);
            }
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                               UnitTesting::Commands::TestListInt8UReverseRequest::Id, value, chip::NullOptional

            );
        }
        case 166: {
            LogStep(166, "Send Test Command With empty List of INT8U and get an empty list back");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestListInt8UReverseRequest::Type value;

            value.arg1 = chip::app::DataModel::List<uint8_t>();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                               UnitTesting::Commands::TestListInt8UReverseRequest::Id, value, chip::NullOptional

            );
        }
        case 167: {
            LogStep(167, "Send Test Command With List of Struct Argument and arg1.b of first item is true");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestListStructArgumentRequest::Type value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::UnitTesting::Structs::SimpleStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].a = 0U;
                listHolder_0->mList[0].b = true;
                listHolder_0->mList[0].c = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(2);
                listHolder_0->mList[0].d =
                    chip::ByteSpan(chip::Uint8::from_const_char("first_octet_stringgarbage: not in length on purpose"), 18);
                listHolder_0->mList[0].e = chip::Span<const char>("first_char_stringgarbage: not in length on purpose", 17);
                listHolder_0->mList[0].f = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::SimpleBitmap>>(1U);
                listHolder_0->mList[0].g = 0.0f;
                listHolder_0->mList[0].h = 0;

                listHolder_0->mList[1].a = 1U;
                listHolder_0->mList[1].b = true;
                listHolder_0->mList[1].c = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(3);
                listHolder_0->mList[1].d =
                    chip::ByteSpan(chip::Uint8::from_const_char("second_octet_stringgarbage: not in length on purpose"), 19);
                listHolder_0->mList[1].e = chip::Span<const char>("second_char_stringgarbage: not in length on purpose", 18);
                listHolder_0->mList[1].f = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::SimpleBitmap>>(1U);
                listHolder_0->mList[1].g = 0.0f;
                listHolder_0->mList[1].h = 0;

                value.arg1 = chip::app::DataModel::List<chip::app::Clusters::UnitTesting::Structs::SimpleStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                               UnitTesting::Commands::TestListStructArgumentRequest::Id, value, chip::NullOptional

            );
        }
        case 168: {
            LogStep(168, "Send Test Command With List of Struct Argument and arg1.b of first item is false");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestListStructArgumentRequest::Type value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::UnitTesting::Structs::SimpleStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].a = 1U;
                listHolder_0->mList[0].b = true;
                listHolder_0->mList[0].c = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(3);
                listHolder_0->mList[0].d =
                    chip::ByteSpan(chip::Uint8::from_const_char("second_octet_stringgarbage: not in length on purpose"), 19);
                listHolder_0->mList[0].e = chip::Span<const char>("second_char_stringgarbage: not in length on purpose", 18);
                listHolder_0->mList[0].f = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::SimpleBitmap>>(1U);
                listHolder_0->mList[0].g = 0.0f;
                listHolder_0->mList[0].h = 0;

                listHolder_0->mList[1].a = 0U;
                listHolder_0->mList[1].b = false;
                listHolder_0->mList[1].c = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(2);
                listHolder_0->mList[1].d =
                    chip::ByteSpan(chip::Uint8::from_const_char("first_octet_stringgarbage: not in length on purpose"), 18);
                listHolder_0->mList[1].e = chip::Span<const char>("first_char_stringgarbage: not in length on purpose", 17);
                listHolder_0->mList[1].f = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::SimpleBitmap>>(1U);
                listHolder_0->mList[1].g = 0.0f;
                listHolder_0->mList[1].h = 0;

                value.arg1 = chip::app::DataModel::List<chip::app::Clusters::UnitTesting::Structs::SimpleStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                               UnitTesting::Commands::TestListStructArgumentRequest::Id, value, chip::NullOptional

            );
        }
        case 169: {
            LogStep(169,
                    "Send Test Command With List of Nested Struct List Argument and all fields b of elements of arg1.d are true");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestListNestedStructListArgumentRequest::Type value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::UnitTesting::Structs::NestedStructList::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].a = 0U;
                listHolder_0->mList[0].b = true;

                listHolder_0->mList[0].c.a = 0U;
                listHolder_0->mList[0].c.b = true;
                listHolder_0->mList[0].c.c = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(2);
                listHolder_0->mList[0].c.d =
                    chip::ByteSpan(chip::Uint8::from_const_char("octet_stringgarbage: not in length on purpose"), 12);
                listHolder_0->mList[0].c.e = chip::Span<const char>("char_stringgarbage: not in length on purpose", 11);
                listHolder_0->mList[0].c.f = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::SimpleBitmap>>(1U);
                listHolder_0->mList[0].c.g = 0.0f;
                listHolder_0->mList[0].c.h = 0;

                {
                    auto * listHolder_2 = new ListHolder<chip::app::Clusters::UnitTesting::Structs::SimpleStruct::Type>(2);
                    listFreer.add(listHolder_2);

                    listHolder_2->mList[0].a = 1U;
                    listHolder_2->mList[0].b = true;
                    listHolder_2->mList[0].c = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(3);
                    listHolder_2->mList[0].d =
                        chip::ByteSpan(chip::Uint8::from_const_char("nested_octet_stringgarbage: not in length on purpose"), 19);
                    listHolder_2->mList[0].e = chip::Span<const char>("nested_char_stringgarbage: not in length on purpose", 18);
                    listHolder_2->mList[0].f = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::SimpleBitmap>>(1U);
                    listHolder_2->mList[0].g = 0.0f;
                    listHolder_2->mList[0].h = 0;

                    listHolder_2->mList[1].a = 2U;
                    listHolder_2->mList[1].b = true;
                    listHolder_2->mList[1].c = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(3);
                    listHolder_2->mList[1].d =
                        chip::ByteSpan(chip::Uint8::from_const_char("nested_octet_stringgarbage: not in length on purpose"), 19);
                    listHolder_2->mList[1].e = chip::Span<const char>("nested_char_stringgarbage: not in length on purpose", 18);
                    listHolder_2->mList[1].f = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::SimpleBitmap>>(1U);
                    listHolder_2->mList[1].g = 0.0f;
                    listHolder_2->mList[1].h = 0;

                    listHolder_0->mList[0].d =
                        chip::app::DataModel::List<chip::app::Clusters::UnitTesting::Structs::SimpleStruct::Type>(
                            listHolder_2->mList, 2);
                }

                {
                    auto * listHolder_2 = new ListHolder<uint32_t>(3);
                    listFreer.add(listHolder_2);
                    listHolder_2->mList[0]   = 1UL;
                    listHolder_2->mList[1]   = 2UL;
                    listHolder_2->mList[2]   = 3UL;
                    listHolder_0->mList[0].e = chip::app::DataModel::List<uint32_t>(listHolder_2->mList, 3);
                }

                {
                    auto * listHolder_2 = new ListHolder<chip::ByteSpan>(3);
                    listFreer.add(listHolder_2);
                    listHolder_2->mList[0] =
                        chip::ByteSpan(chip::Uint8::from_const_char("octet_string_1garbage: not in length on purpose"), 14);
                    listHolder_2->mList[1] =
                        chip::ByteSpan(chip::Uint8::from_const_char("octect_string_2garbage: not in length on purpose"), 15);
                    listHolder_2->mList[2] =
                        chip::ByteSpan(chip::Uint8::from_const_char("octet_string_3garbage: not in length on purpose"), 14);
                    listHolder_0->mList[0].f = chip::app::DataModel::List<chip::ByteSpan>(listHolder_2->mList, 3);
                }

                {
                    auto * listHolder_2 = new ListHolder<uint8_t>(2);
                    listFreer.add(listHolder_2);
                    listHolder_2->mList[0]   = 0U;
                    listHolder_2->mList[1]   = 255U;
                    listHolder_0->mList[0].g = chip::app::DataModel::List<uint8_t>(listHolder_2->mList, 2);
                }

                value.arg1 = chip::app::DataModel::List<chip::app::Clusters::UnitTesting::Structs::NestedStructList::Type>(
                    listHolder_0->mList, 1);
            }
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                               UnitTesting::Commands::TestListNestedStructListArgumentRequest::Id, value, chip::NullOptional

            );
        }
        case 170: {
            LogStep(170, "Send Test Command With Nested Struct List Argument and some fields b of elements of arg1.d are false");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestListNestedStructListArgumentRequest::Type value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::UnitTesting::Structs::NestedStructList::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].a = 0U;
                listHolder_0->mList[0].b = true;

                listHolder_0->mList[0].c.a = 0U;
                listHolder_0->mList[0].c.b = true;
                listHolder_0->mList[0].c.c = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(2);
                listHolder_0->mList[0].c.d =
                    chip::ByteSpan(chip::Uint8::from_const_char("octet_stringgarbage: not in length on purpose"), 12);
                listHolder_0->mList[0].c.e = chip::Span<const char>("char_stringgarbage: not in length on purpose", 11);
                listHolder_0->mList[0].c.f = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::SimpleBitmap>>(1U);
                listHolder_0->mList[0].c.g = 0.0f;
                listHolder_0->mList[0].c.h = 0;

                {
                    auto * listHolder_2 = new ListHolder<chip::app::Clusters::UnitTesting::Structs::SimpleStruct::Type>(2);
                    listFreer.add(listHolder_2);

                    listHolder_2->mList[0].a = 1U;
                    listHolder_2->mList[0].b = true;
                    listHolder_2->mList[0].c = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(3);
                    listHolder_2->mList[0].d =
                        chip::ByteSpan(chip::Uint8::from_const_char("nested_octet_stringgarbage: not in length on purpose"), 19);
                    listHolder_2->mList[0].e = chip::Span<const char>("nested_char_stringgarbage: not in length on purpose", 18);
                    listHolder_2->mList[0].f = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::SimpleBitmap>>(1U);
                    listHolder_2->mList[0].g = 0.0f;
                    listHolder_2->mList[0].h = 0;

                    listHolder_2->mList[1].a = 2U;
                    listHolder_2->mList[1].b = false;
                    listHolder_2->mList[1].c = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(3);
                    listHolder_2->mList[1].d =
                        chip::ByteSpan(chip::Uint8::from_const_char("nested_octet_stringgarbage: not in length on purpose"), 19);
                    listHolder_2->mList[1].e = chip::Span<const char>("nested_char_stringgarbage: not in length on purpose", 18);
                    listHolder_2->mList[1].f = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::SimpleBitmap>>(1U);
                    listHolder_2->mList[1].g = 0.0f;
                    listHolder_2->mList[1].h = 0;

                    listHolder_0->mList[0].d =
                        chip::app::DataModel::List<chip::app::Clusters::UnitTesting::Structs::SimpleStruct::Type>(
                            listHolder_2->mList, 2);
                }

                {
                    auto * listHolder_2 = new ListHolder<uint32_t>(3);
                    listFreer.add(listHolder_2);
                    listHolder_2->mList[0]   = 1UL;
                    listHolder_2->mList[1]   = 2UL;
                    listHolder_2->mList[2]   = 3UL;
                    listHolder_0->mList[0].e = chip::app::DataModel::List<uint32_t>(listHolder_2->mList, 3);
                }

                {
                    auto * listHolder_2 = new ListHolder<chip::ByteSpan>(3);
                    listFreer.add(listHolder_2);
                    listHolder_2->mList[0] =
                        chip::ByteSpan(chip::Uint8::from_const_char("octet_string_1garbage: not in length on purpose"), 14);
                    listHolder_2->mList[1] =
                        chip::ByteSpan(chip::Uint8::from_const_char("octect_string_2garbage: not in length on purpose"), 15);
                    listHolder_2->mList[2] =
                        chip::ByteSpan(chip::Uint8::from_const_char("octet_string_3garbage: not in length on purpose"), 14);
                    listHolder_0->mList[0].f = chip::app::DataModel::List<chip::ByteSpan>(listHolder_2->mList, 3);
                }

                {
                    auto * listHolder_2 = new ListHolder<uint8_t>(2);
                    listFreer.add(listHolder_2);
                    listHolder_2->mList[0]   = 0U;
                    listHolder_2->mList[1]   = 255U;
                    listHolder_0->mList[0].g = chip::app::DataModel::List<uint8_t>(listHolder_2->mList, 2);
                }

                value.arg1 = chip::app::DataModel::List<chip::app::Clusters::UnitTesting::Structs::NestedStructList::Type>(
                    listHolder_0->mList, 1);
            }
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                               UnitTesting::Commands::TestListNestedStructListArgumentRequest::Id, value, chip::NullOptional

            );
        }
        case 171: {
            LogStep(171, "Write attribute LIST With List of INT8U and none of them is set to 0");
            ListFreer listFreer;
            chip::app::DataModel::List<const uint8_t> value;

            {
                auto * listHolder_0 = new ListHolder<uint8_t>(4);
                listFreer.add(listHolder_0);
                listHolder_0->mList[0] = 1U;
                listHolder_0->mList[1] = 2U;
                listHolder_0->mList[2] = 3U;
                listHolder_0->mList[3] = 4U;
                value                  = chip::app::DataModel::List<uint8_t>(listHolder_0->mList, 4);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::ListInt8u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 172: {
            LogStep(172, "Read attribute LIST With List of INT8U");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::ListInt8u::Id, true,
                                 chip::NullOptional);
        }
        case 173: {
            LogStep(173, "Write attribute LIST With List of OCTET_STRING");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::ByteSpan> value;

            {
                auto * listHolder_0 = new ListHolder<chip::ByteSpan>(4);
                listFreer.add(listHolder_0);
                listHolder_0->mList[0] = chip::ByteSpan(chip::Uint8::from_const_char("Test0garbage: not in length on purpose"), 5);
                listHolder_0->mList[1] = chip::ByteSpan(chip::Uint8::from_const_char("Test1garbage: not in length on purpose"), 5);
                listHolder_0->mList[2] = chip::ByteSpan(chip::Uint8::from_const_char("Test2garbage: not in length on purpose"), 5);
                listHolder_0->mList[3] = chip::ByteSpan(chip::Uint8::from_const_char("Test3garbage: not in length on purpose"), 5);
                value                  = chip::app::DataModel::List<chip::ByteSpan>(listHolder_0->mList, 4);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::ListOctetString::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 174: {
            LogStep(174, "Read attribute LIST With List of OCTET_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::ListOctetString::Id,
                                 true, chip::NullOptional);
        }
        case 175: {
            LogStep(175, "Write attribute LIST With List of LIST_STRUCT_OCTET_STRING");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::UnitTesting::Structs::TestListStructOctet::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::UnitTesting::Structs::TestListStructOctet::Type>(4);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].member1 = 0ULL;
                listHolder_0->mList[0].member2 =
                    chip::ByteSpan(chip::Uint8::from_const_char("Test0garbage: not in length on purpose"), 5);

                listHolder_0->mList[1].member1 = 1ULL;
                listHolder_0->mList[1].member2 =
                    chip::ByteSpan(chip::Uint8::from_const_char("Test1garbage: not in length on purpose"), 5);

                listHolder_0->mList[2].member1 = 2ULL;
                listHolder_0->mList[2].member2 =
                    chip::ByteSpan(chip::Uint8::from_const_char("Test2garbage: not in length on purpose"), 5);

                listHolder_0->mList[3].member1 = 3ULL;
                listHolder_0->mList[3].member2 =
                    chip::ByteSpan(chip::Uint8::from_const_char("Test3garbage: not in length on purpose"), 5);

                value = chip::app::DataModel::List<chip::app::Clusters::UnitTesting::Structs::TestListStructOctet::Type>(
                    listHolder_0->mList, 4);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::ListStructOctetString::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 176: {
            LogStep(176, "Read attribute LIST With List of LIST_STRUCT_OCTET_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::ListStructOctetString::Id, true, chip::NullOptional);
        }
        case 177: {
            LogStep(177, "Send Test Command with optional arg set.");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestNullableOptionalRequest::Type value;
            value.arg1.Emplace();
            value.arg1.Value().SetNonNull();
            value.arg1.Value().Value() = 5U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                               UnitTesting::Commands::TestNullableOptionalRequest::Id, value, chip::NullOptional

            );
        }
        case 178: {
            LogStep(178, "Send Test Command without its optional arg.");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestNullableOptionalRequest::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                               UnitTesting::Commands::TestNullableOptionalRequest::Id, value, chip::NullOptional

            );
        }
        case 179: {
            LogStep(179, "Read list of structs containing nullables and optionals");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::ListNullablesAndOptionalsStruct::Id, true, chip::NullOptional);
        }
        case 180: {
            LogStep(180, "Write list of structs containing nullables and optionals");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::UnitTesting::Structs::NullablesAndOptionalsStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::UnitTesting::Structs::NullablesAndOptionalsStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].nullableInt.SetNull();
                listHolder_0->mList[0].nullableString.SetNull();
                listHolder_0->mList[0].nullableStruct.SetNull();
                listHolder_0->mList[0].nullableList.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::UnitTesting::SimpleEnum>(2);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0] = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(1);
                    listHolder_3->mList[1] = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(2);
                    listHolder_0->mList[0].nullableList.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::UnitTesting::SimpleEnum>(listHolder_3->mList, 2);
                }

                value = chip::app::DataModel::List<chip::app::Clusters::UnitTesting::Structs::NullablesAndOptionalsStruct::Type>(
                    listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::ListNullablesAndOptionalsStruct::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 181: {
            LogStep(181, "Read list of structs containing nullables and optionals after writing");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::ListNullablesAndOptionalsStruct::Id, true, chip::NullOptional);
        }
        case 182: {
            LogStep(182, "Write attribute NULLABLE_BOOLEAN null");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<bool> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBoolean::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 183: {
            LogStep(183, "Read attribute NULLABLE_BOOLEAN null");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBoolean::Id,
                                 true, chip::NullOptional);
        }
        case 184: {
            LogStep(184, "Write attribute NULLABLE_BOOLEAN True");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<bool> value;
            value.SetNonNull();
            value.Value() = true;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBoolean::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 185: {
            LogStep(185, "Read attribute NULLABLE_BOOLEAN True");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBoolean::Id,
                                 true, chip::NullOptional);
        }
        case 186: {
            LogStep(186, "Read attribute NULLABLE_BOOLEAN not null");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBoolean::Id,
                                 true, chip::NullOptional);
        }
        case 187: {
            LogStep(187, "Write attribute NULLABLE_BITMAP8 Max Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap>> value;
            value.SetNonNull();
            value.Value() = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap>>(254U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap8::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 188: {
            LogStep(188, "Read attribute NULLABLE_BITMAP8 Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap8::Id,
                                 true, chip::NullOptional);
        }
        case 189: {
            LogStep(189, "Write attribute NULLABLE_BITMAP8 Invalid Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap>> value;
            value.SetNonNull();
            value.Value() = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap>>(255U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap8::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 190: {
            LogStep(190, "Read attribute NULLABLE_BITMAP8 unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap8::Id,
                                 true, chip::NullOptional);
        }
        case 191: {
            LogStep(191, "Write attribute NULLABLE_BITMAP8 null Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap>> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap8::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 192: {
            LogStep(192, "Read attribute NULLABLE_BITMAP8 null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap8::Id,
                                 true, chip::NullOptional);
        }
        case 193: {
            LogStep(193, "Read attribute NULLABLE_BITMAP8 not 254 Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap8::Id,
                                 true, chip::NullOptional);
        }
        case 194: {
            LogStep(194, "Write attribute NULLABLE_BITMAP16 Max Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap>> value;
            value.SetNonNull();
            value.Value() = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap>>(65534U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap16::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 195: {
            LogStep(195, "Read attribute NULLABLE_BITMAP16 Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap16::Id,
                                 true, chip::NullOptional);
        }
        case 196: {
            LogStep(196, "Write attribute NULLABLE_BITMAP16 Invalid Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap>> value;
            value.SetNonNull();
            value.Value() = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap>>(65535U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap16::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 197: {
            LogStep(197, "Read attribute NULLABLE_BITMAP16 unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap16::Id,
                                 true, chip::NullOptional);
        }
        case 198: {
            LogStep(198, "Write attribute NULLABLE_BITMAP16 null Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap>> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap16::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 199: {
            LogStep(199, "Read attribute NULLABLE_BITMAP16 null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap16::Id,
                                 true, chip::NullOptional);
        }
        case 200: {
            LogStep(200, "Write attribute NULLABLE_BITMAP32 Max Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap>> value;
            value.SetNonNull();
            value.Value() = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap>>(4294967294UL);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap32::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 201: {
            LogStep(201, "Read attribute NULLABLE_BITMAP32 Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap32::Id,
                                 true, chip::NullOptional);
        }
        case 202: {
            LogStep(202, "Write attribute NULLABLE_BITMAP32 Invalid Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap>> value;
            value.SetNonNull();
            value.Value() = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap>>(4294967295UL);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap32::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 203: {
            LogStep(203, "Read attribute NULLABLE_BITMAP32 unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap32::Id,
                                 true, chip::NullOptional);
        }
        case 204: {
            LogStep(204, "Write attribute NULLABLE_BITMAP32 null Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap>> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap32::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 205: {
            LogStep(205, "Read attribute NULLABLE_BITMAP32 null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap32::Id,
                                 true, chip::NullOptional);
        }
        case 206: {
            LogStep(206, "Write attribute NULLABLE_BITMAP64 Max Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap>> value;
            value.SetNonNull();
            value.Value() = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap>>(18446744073709551614ULL);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap64::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 207: {
            LogStep(207, "Read attribute NULLABLE_BITMAP64 Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap64::Id,
                                 true, chip::NullOptional);
        }
        case 208: {
            LogStep(208, "Write attribute NULLABLE_BITMAP64 Invalid Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap>> value;
            value.SetNonNull();
            value.Value() = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap>>(18446744073709551615ULL);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap64::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 209: {
            LogStep(209, "Read attribute NULLABLE_BITMAP64 unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap64::Id,
                                 true, chip::NullOptional);
        }
        case 210: {
            LogStep(210, "Write attribute NULLABLE_BITMAP64 null Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap>> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap64::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 211: {
            LogStep(211, "Read attribute NULLABLE_BITMAP64 null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap64::Id,
                                 true, chip::NullOptional);
        }
        case 212: {
            LogStep(212, "Write attribute NULLABLE_INT8U Min Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 213: {
            LogStep(213, "Read attribute NULLABLE_INT8U Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8u::Id, true,
                                 chip::NullOptional);
        }
        case 214: {
            LogStep(214, "Write attribute NULLABLE_INT8U Max Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 254U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 215: {
            LogStep(215, "Read attribute NULLABLE_INT8U Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8u::Id, true,
                                 chip::NullOptional);
        }
        case 216: {
            LogStep(216, "Write attribute NULLABLE_INT8U Invalid Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 255U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 217: {
            LogStep(217, "Read attribute NULLABLE_INT8U unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8u::Id, true,
                                 chip::NullOptional);
        }
        case 218: {
            LogStep(218, "Read attribute NULLABLE_INT8U unchanged Value with constraint");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8u::Id, true,
                                 chip::NullOptional);
        }
        case 219: {
            LogStep(219, "Write attribute NULLABLE_INT8U null Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 220: {
            LogStep(220, "Read attribute NULLABLE_INT8U null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8u::Id, true,
                                 chip::NullOptional);
        }
        case 221: {
            LogStep(221, "Read attribute NULLABLE_INT8U null Value & range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8u::Id, true,
                                 chip::NullOptional);
        }
        case 222: {
            LogStep(222, "Read attribute NULLABLE_INT8U null Value & not");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8u::Id, true,
                                 chip::NullOptional);
        }
        case 223: {
            LogStep(223, "Write attribute NULLABLE_INT8U Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 128U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 224: {
            LogStep(224, "Read attribute NULLABLE_INT8U Value in range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8u::Id, true,
                                 chip::NullOptional);
        }
        case 225: {
            LogStep(225, "Read attribute NULLABLE_INT8U notValue OK");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8u::Id, true,
                                 chip::NullOptional);
        }
        case 226: {
            LogStep(226, "Write attribute NULLABLE_INT16U Min Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint16_t> value;
            value.SetNonNull();
            value.Value() = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 227: {
            LogStep(227, "Read attribute NULLABLE_INT16U Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16u::Id, true,
                                 chip::NullOptional);
        }
        case 228: {
            LogStep(228, "Write attribute NULLABLE_INT16U Max Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint16_t> value;
            value.SetNonNull();
            value.Value() = 65534U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 229: {
            LogStep(229, "Read attribute NULLABLE_INT16U Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16u::Id, true,
                                 chip::NullOptional);
        }
        case 230: {
            LogStep(230, "Write attribute NULLABLE_INT16U Invalid Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint16_t> value;
            value.SetNonNull();
            value.Value() = 65535U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 231: {
            LogStep(231, "Read attribute NULLABLE_INT16U unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16u::Id, true,
                                 chip::NullOptional);
        }
        case 232: {
            LogStep(232, "Write attribute NULLABLE_INT16U null Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint16_t> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 233: {
            LogStep(233, "Read attribute NULLABLE_INT16U null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16u::Id, true,
                                 chip::NullOptional);
        }
        case 234: {
            LogStep(234, "Read attribute NULLABLE_INT16U null Value & range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16u::Id, true,
                                 chip::NullOptional);
        }
        case 235: {
            LogStep(235, "Read attribute NULLABLE_INT16U null Value & not");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16u::Id, true,
                                 chip::NullOptional);
        }
        case 236: {
            LogStep(236, "Write attribute NULLABLE_INT16U Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint16_t> value;
            value.SetNonNull();
            value.Value() = 32000U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 237: {
            LogStep(237, "Read attribute NULLABLE_INT16U Value in range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16u::Id, true,
                                 chip::NullOptional);
        }
        case 238: {
            LogStep(238, "Read attribute NULLABLE_INT16U notValue OK");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16u::Id, true,
                                 chip::NullOptional);
        }
        case 239: {
            LogStep(239, "Write attribute NULLABLE_INT32U Min Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint32_t> value;
            value.SetNonNull();
            value.Value() = 0UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 240: {
            LogStep(240, "Read attribute NULLABLE_INT32U Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32u::Id, true,
                                 chip::NullOptional);
        }
        case 241: {
            LogStep(241, "Write attribute NULLABLE_INT32U Max Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint32_t> value;
            value.SetNonNull();
            value.Value() = 4294967294UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 242: {
            LogStep(242, "Read attribute NULLABLE_INT32U Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32u::Id, true,
                                 chip::NullOptional);
        }
        case 243: {
            LogStep(243, "Write attribute NULLABLE_INT32U Invalid Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint32_t> value;
            value.SetNonNull();
            value.Value() = 4294967295UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 244: {
            LogStep(244, "Read attribute NULLABLE_INT32U unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32u::Id, true,
                                 chip::NullOptional);
        }
        case 245: {
            LogStep(245, "Write attribute NULLABLE_INT32U null Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint32_t> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 246: {
            LogStep(246, "Read attribute NULLABLE_INT32U null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32u::Id, true,
                                 chip::NullOptional);
        }
        case 247: {
            LogStep(247, "Read attribute NULLABLE_INT32U null Value & range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32u::Id, true,
                                 chip::NullOptional);
        }
        case 248: {
            LogStep(248, "Read attribute NULLABLE_INT32U null Value & not");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32u::Id, true,
                                 chip::NullOptional);
        }
        case 249: {
            LogStep(249, "Write attribute NULLABLE_INT32U Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint32_t> value;
            value.SetNonNull();
            value.Value() = 2147483647UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 250: {
            LogStep(250, "Read attribute NULLABLE_INT32U Value in range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32u::Id, true,
                                 chip::NullOptional);
        }
        case 251: {
            LogStep(251, "Read attribute NULLABLE_INT32U notValue OK");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32u::Id, true,
                                 chip::NullOptional);
        }
        case 252: {
            LogStep(252, "Write attribute NULLABLE_INT64U Min Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint64_t> value;
            value.SetNonNull();
            value.Value() = 0ULL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 253: {
            LogStep(253, "Read attribute NULLABLE_INT64U Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64u::Id, true,
                                 chip::NullOptional);
        }
        case 254: {
            LogStep(254, "Write attribute NULLABLE_INT64U Max Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint64_t> value;
            value.SetNonNull();
            value.Value() = 18446744073709551614ULL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 255: {
            LogStep(255, "Read attribute NULLABLE_INT64U Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64u::Id, true,
                                 chip::NullOptional);
        }
        case 256: {
            LogStep(256, "Write attribute NULLABLE_INT64U Invalid Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint64_t> value;
            value.SetNonNull();
            value.Value() = 18446744073709551615ULL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 257: {
            LogStep(257, "Read attribute NULLABLE_INT64U unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64u::Id, true,
                                 chip::NullOptional);
        }
        case 258: {
            LogStep(258, "Write attribute NULLABLE_INT64U null Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint64_t> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 259: {
            LogStep(259, "Read attribute NULLABLE_INT64U null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64u::Id, true,
                                 chip::NullOptional);
        }
        case 260: {
            LogStep(260, "Read attribute NULLABLE_INT64U null Value & range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64u::Id, true,
                                 chip::NullOptional);
        }
        case 261: {
            LogStep(261, "Read attribute NULLABLE_INT64U null Value & not");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64u::Id, true,
                                 chip::NullOptional);
        }
        case 262: {
            LogStep(262, "Write attribute NULLABLE_INT64U Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint64_t> value;
            value.SetNonNull();
            value.Value() = 18000000000000000000ULL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 263: {
            LogStep(263, "Read attribute NULLABLE_INT64U Value in range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64u::Id, true,
                                 chip::NullOptional);
        }
        case 264: {
            LogStep(264, "Read attribute NULLABLE_INT64U notValue OK");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64u::Id, true,
                                 chip::NullOptional);
        }
        case 265: {
            LogStep(265, "Write attribute NULLABLE_INT8S Min Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int8_t> value;
            value.SetNonNull();
            value.Value() = -127;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 266: {
            LogStep(266, "Read attribute NULLABLE_INT8S Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8s::Id, true,
                                 chip::NullOptional);
        }
        case 267: {
            LogStep(267, "Write attribute NULLABLE_INT8S Invalid Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int8_t> value;
            value.SetNonNull();
            value.Value() = -128;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 268: {
            LogStep(268, "Read attribute NULLABLE_INT8S unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8s::Id, true,
                                 chip::NullOptional);
        }
        case 269: {
            LogStep(269, "Write attribute NULLABLE_INT8S null Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int8_t> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 270: {
            LogStep(270, "Read attribute NULLABLE_INT8S null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8s::Id, true,
                                 chip::NullOptional);
        }
        case 271: {
            LogStep(271, "Read attribute NULLABLE_INT8S null Value & range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8s::Id, true,
                                 chip::NullOptional);
        }
        case 272: {
            LogStep(272, "Read attribute NULLABLE_INT8S null Value & not");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8s::Id, true,
                                 chip::NullOptional);
        }
        case 273: {
            LogStep(273, "Write attribute NULLABLE_INT8S Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int8_t> value;
            value.SetNonNull();
            value.Value() = -127;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 274: {
            LogStep(274, "Read attribute NULLABLE_INT8S Value in range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8s::Id, true,
                                 chip::NullOptional);
        }
        case 275: {
            LogStep(275, "Read attribute NULLABLE_INT8S notValue OK");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8s::Id, true,
                                 chip::NullOptional);
        }
        case 276: {
            LogStep(276, "Write attribute NULLABLE_INT16S Min Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int16_t> value;
            value.SetNonNull();
            value.Value() = -32767;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 277: {
            LogStep(277, "Read attribute NULLABLE_INT16S Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16s::Id, true,
                                 chip::NullOptional);
        }
        case 278: {
            LogStep(278, "Write attribute NULLABLE_INT16S Invalid Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int16_t> value;
            value.SetNonNull();
            value.Value() = -32768;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 279: {
            LogStep(279, "Read attribute NULLABLE_INT16S unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16s::Id, true,
                                 chip::NullOptional);
        }
        case 280: {
            LogStep(280, "Write attribute NULLABLE_INT16S null Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int16_t> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 281: {
            LogStep(281, "Read attribute NULLABLE_INT16S null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16s::Id, true,
                                 chip::NullOptional);
        }
        case 282: {
            LogStep(282, "Read attribute NULLABLE_INT16S null Value & range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16s::Id, true,
                                 chip::NullOptional);
        }
        case 283: {
            LogStep(283, "Read attribute NULLABLE_INT16S null Value & not");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16s::Id, true,
                                 chip::NullOptional);
        }
        case 284: {
            LogStep(284, "Write attribute NULLABLE_INT16S Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int16_t> value;
            value.SetNonNull();
            value.Value() = -32767;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 285: {
            LogStep(285, "Read attribute NULLABLE_INT16S Value in range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16s::Id, true,
                                 chip::NullOptional);
        }
        case 286: {
            LogStep(286, "Read attribute NULLABLE_INT16S notValue OK");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16s::Id, true,
                                 chip::NullOptional);
        }
        case 287: {
            LogStep(287, "Write attribute NULLABLE_INT32S Min Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int32_t> value;
            value.SetNonNull();
            value.Value() = -2147483647L;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 288: {
            LogStep(288, "Read attribute NULLABLE_INT32S Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32s::Id, true,
                                 chip::NullOptional);
        }
        case 289: {
            LogStep(289, "Write attribute NULLABLE_INT32S Invalid Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int32_t> value;
            value.SetNonNull();
            value.Value() = -2147483648L;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 290: {
            LogStep(290, "Read attribute NULLABLE_INT32S unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32s::Id, true,
                                 chip::NullOptional);
        }
        case 291: {
            LogStep(291, "Write attribute NULLABLE_INT32S null Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int32_t> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 292: {
            LogStep(292, "Read attribute NULLABLE_INT32S null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32s::Id, true,
                                 chip::NullOptional);
        }
        case 293: {
            LogStep(293, "Read attribute NULLABLE_INT32S null Value & range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32s::Id, true,
                                 chip::NullOptional);
        }
        case 294: {
            LogStep(294, "Read attribute NULLABLE_INT32S null Value & not");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32s::Id, true,
                                 chip::NullOptional);
        }
        case 295: {
            LogStep(295, "Write attribute NULLABLE_INT32S Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int32_t> value;
            value.SetNonNull();
            value.Value() = -2147483647L;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 296: {
            LogStep(296, "Read attribute NULLABLE_INT32S Value in range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32s::Id, true,
                                 chip::NullOptional);
        }
        case 297: {
            LogStep(297, "Read attribute NULLABLE_INT32S notValue OK");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32s::Id, true,
                                 chip::NullOptional);
        }
        case 298: {
            LogStep(298, "Write attribute NULLABLE_INT64S Min Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int64_t> value;
            value.SetNonNull();
            value.Value() = -9223372036854775807LL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 299: {
            LogStep(299, "Read attribute NULLABLE_INT64S Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64s::Id, true,
                                 chip::NullOptional);
        }
        case 300: {
            LogStep(300, "Write attribute NULLABLE_INT64S Invalid Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int64_t> value;
            value.SetNonNull();
            value.Value() = static_cast<int64_t>(-9223372036854775807LL - 1);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 301: {
            LogStep(301, "Read attribute NULLABLE_INT64S unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64s::Id, true,
                                 chip::NullOptional);
        }
        case 302: {
            LogStep(302, "Write attribute NULLABLE_INT64S null Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int64_t> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 303: {
            LogStep(303, "Read attribute NULLABLE_INT64S null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64s::Id, true,
                                 chip::NullOptional);
        }
        case 304: {
            LogStep(304, "Read attribute NULLABLE_INT64S null Value & range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64s::Id, true,
                                 chip::NullOptional);
        }
        case 305: {
            LogStep(305, "Read attribute NULLABLE_INT64S null Value & not");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64s::Id, true,
                                 chip::NullOptional);
        }
        case 306: {
            LogStep(306, "Write attribute NULLABLE_INT64S Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int64_t> value;
            value.SetNonNull();
            value.Value() = -9223372036854775807LL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 307: {
            LogStep(307, "Read attribute NULLABLE_INT64S Value in range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64s::Id, true,
                                 chip::NullOptional);
        }
        case 308: {
            LogStep(308, "Read attribute NULLABLE_INT64S notValue OK");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64s::Id, true,
                                 chip::NullOptional);
        }
        case 309: {
            LogStep(309, "Write attribute NULLABLE_SINGLE medium Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<float> value;
            value.SetNonNull();
            value.Value() = 0.1f;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableFloatSingle::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 310: {
            LogStep(310, "Read attribute NULLABLE_SINGLE medium Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableFloatSingle::Id,
                                 true, chip::NullOptional);
        }
        case 311: {
            LogStep(311, "Write attribute NULLABLE_SINGLE largest Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<float> value;
            value.SetNonNull();
            value.Value() = INFINITY;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableFloatSingle::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 312: {
            LogStep(312, "Read attribute NULLABLE_SINGLE largest Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableFloatSingle::Id,
                                 true, chip::NullOptional);
        }
        case 313: {
            LogStep(313, "Write attribute NULLABLE_SINGLE smallest Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<float> value;
            value.SetNonNull();
            value.Value() = -INFINITY;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableFloatSingle::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 314: {
            LogStep(314, "Read attribute NULLABLE_SINGLE smallest Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableFloatSingle::Id,
                                 true, chip::NullOptional);
        }
        case 315: {
            LogStep(315, "Write attribute NULLABLE_SINGLE null Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<float> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableFloatSingle::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 316: {
            LogStep(316, "Read attribute NULLABLE_SINGLE null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableFloatSingle::Id,
                                 true, chip::NullOptional);
        }
        case 317: {
            LogStep(317, "Write attribute NULLABLE_SINGLE 0 Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<float> value;
            value.SetNonNull();
            value.Value() = 0.0f;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableFloatSingle::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 318: {
            LogStep(318, "Read attribute NULLABLE_SINGLE 0 Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableFloatSingle::Id,
                                 true, chip::NullOptional);
        }
        case 319: {
            LogStep(319, "Write attribute NULLABLE_DOUBLE medium Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<double> value;
            value.SetNonNull();
            value.Value() = 0.1234567890123;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableFloatDouble::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 320: {
            LogStep(320, "Read attribute NULLABLE_DOUBLE medium Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableFloatDouble::Id,
                                 true, chip::NullOptional);
        }
        case 321: {
            LogStep(321, "Write attribute NULLABLE_DOUBLE largest Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<double> value;
            value.SetNonNull();
            value.Value() = INFINITY;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableFloatDouble::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 322: {
            LogStep(322, "Read attribute NULLABLE_DOUBLE largest Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableFloatDouble::Id,
                                 true, chip::NullOptional);
        }
        case 323: {
            LogStep(323, "Write attribute NULLABLE_DOUBLE smallest Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<double> value;
            value.SetNonNull();
            value.Value() = -INFINITY;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableFloatDouble::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 324: {
            LogStep(324, "Read attribute NULLABLE_DOUBLE smallest Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableFloatDouble::Id,
                                 true, chip::NullOptional);
        }
        case 325: {
            LogStep(325, "Write attribute NULLABLE_DOUBLE null Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<double> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableFloatDouble::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 326: {
            LogStep(326, "Read attribute NULLABLE_DOUBLE null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableFloatDouble::Id,
                                 true, chip::NullOptional);
        }
        case 327: {
            LogStep(327, "Write attribute NULLABLE_DOUBLE 0 Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<double> value;
            value.SetNonNull();
            value.Value() = 0;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableFloatDouble::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 328: {
            LogStep(328, "Read attribute NULLABLE_DOUBLE 0 Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableFloatDouble::Id,
                                 true, chip::NullOptional);
        }
        case 329: {
            LogStep(329, "Write attribute NULLABLE_ENUM8 Min Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnum8::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 330: {
            LogStep(330, "Read attribute NULLABLE_ENUM8 Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnum8::Id, true,
                                 chip::NullOptional);
        }
        case 331: {
            LogStep(331, "Write attribute NULLABLE_ENUM8 Max Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 254U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnum8::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 332: {
            LogStep(332, "Read attribute NULLABLE_ENUM8 Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnum8::Id, true,
                                 chip::NullOptional);
        }
        case 333: {
            LogStep(333, "Write attribute NULLABLE_ENUM8 Invalid Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 255U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnum8::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 334: {
            LogStep(334, "Read attribute NULLABLE_ENUM8 unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnum8::Id, true,
                                 chip::NullOptional);
        }
        case 335: {
            LogStep(335, "Write attribute NULLABLE_ENUM8 null Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnum8::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 336: {
            LogStep(336, "Read attribute NULLABLE_ENUM8 null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnum8::Id, true,
                                 chip::NullOptional);
        }
        case 337: {
            LogStep(337, "Write attribute NULLABLE_ENUM16 Min Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint16_t> value;
            value.SetNonNull();
            value.Value() = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnum16::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 338: {
            LogStep(338, "Read attribute NULLABLE_ENUM16 Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnum16::Id, true,
                                 chip::NullOptional);
        }
        case 339: {
            LogStep(339, "Write attribute NULLABLE_ENUM16 Max Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint16_t> value;
            value.SetNonNull();
            value.Value() = 65534U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnum16::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 340: {
            LogStep(340, "Read attribute NULLABLE_ENUM16 Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnum16::Id, true,
                                 chip::NullOptional);
        }
        case 341: {
            LogStep(341, "Write attribute NULLABLE_ENUM16 Invalid Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint16_t> value;
            value.SetNonNull();
            value.Value() = 65535U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnum16::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 342: {
            LogStep(342, "Read attribute NULLABLE_ENUM16 unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnum16::Id, true,
                                 chip::NullOptional);
        }
        case 343: {
            LogStep(343, "Write attribute NULLABLE_ENUM16 null Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint16_t> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnum16::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 344: {
            LogStep(344, "Read attribute NULLABLE_ENUM16 null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnum16::Id, true,
                                 chip::NullOptional);
        }
        case 345: {
            LogStep(345, "Write attribute NULLABLE_SIMPLE_ENUM Min Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::app::Clusters::UnitTesting::SimpleEnum> value;
            value.SetNonNull();
            value.Value() = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(0);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnumAttr::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 346: {
            LogStep(346, "Read attribute NULLABLE_SIMPLE_ENUM Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnumAttr::Id,
                                 true, chip::NullOptional);
        }
        case 347: {
            LogStep(347, "Write attribute NULLABLE_SIMPLE_ENUM Max Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::app::Clusters::UnitTesting::SimpleEnum> value;
            value.SetNonNull();
            value.Value() = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(3);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnumAttr::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 348: {
            LogStep(348, "Read attribute NULLABLE_SIMPLE_ENUM Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnumAttr::Id,
                                 true, chip::NullOptional);
        }
        case 349: {
            LogStep(349, "Write attribute NULLABLE_SIMPLE_ENUM Invalid Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::app::Clusters::UnitTesting::SimpleEnum> value;
            value.SetNonNull();
            value.Value() = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(255);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnumAttr::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 350: {
            LogStep(350, "Read attribute NULLABLE_SIMPLE_ENUM unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnumAttr::Id,
                                 true, chip::NullOptional);
        }
        case 351: {
            LogStep(351, "Write attribute NULLABLE_SIMPLE_ENUM null Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::app::Clusters::UnitTesting::SimpleEnum> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnumAttr::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 352: {
            LogStep(352, "Read attribute NULLABLE_SIMPLE_ENUM null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnumAttr::Id,
                                 true, chip::NullOptional);
        }
        case 353: {
            LogStep(353, "Read attribute NULLABLE_SIMPLE_ENUM not 3 Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnumAttr::Id,
                                 true, chip::NullOptional);
        }
        case 354: {
            LogStep(354, "Read attribute NULLABLE_OCTET_STRING Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableOctetString::Id,
                                 true, chip::NullOptional);
        }
        case 355: {
            LogStep(355, "Write attribute NULLABLE_OCTET_STRING");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::ByteSpan> value;
            value.SetNonNull();
            value.Value() = chip::ByteSpan(chip::Uint8::from_const_char("TestValuegarbage: not in length on purpose"), 9);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableOctetString::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 356: {
            LogStep(356, "Read attribute NULLABLE_OCTET_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableOctetString::Id,
                                 true, chip::NullOptional);
        }
        case 357: {
            LogStep(357, "Write attribute NULLABLE_OCTET_STRING");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::ByteSpan> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableOctetString::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 358: {
            LogStep(358, "Read attribute NULLABLE_OCTET_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableOctetString::Id,
                                 true, chip::NullOptional);
        }
        case 359: {
            LogStep(359, "Write attribute NULLABLE_OCTET_STRING");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::ByteSpan> value;
            value.SetNonNull();
            value.Value() = chip::ByteSpan(chip::Uint8::from_const_char("garbage: not in length on purpose"), 0);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableOctetString::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 360: {
            LogStep(360, "Read attribute NULLABLE_OCTET_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableOctetString::Id,
                                 true, chip::NullOptional);
        }
        case 361: {
            LogStep(361, "Read attribute NULLABLE_OCTET_STRING not TestValue");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableOctetString::Id,
                                 true, chip::NullOptional);
        }
        case 362: {
            LogStep(362, "Read attribute NULLABLE_CHAR_STRING Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableCharString::Id,
                                 true, chip::NullOptional);
        }
        case 363: {
            LogStep(363, "Write attribute NULLABLE_CHAR_STRING");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::CharSpan> value;
            value.SetNonNull();
            value.Value() = chip::Span<const char>("☉T☉garbage: not in length on purpose", 7);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableCharString::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 364: {
            LogStep(364, "Read attribute NULLABLE_CHAR_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableCharString::Id,
                                 true, chip::NullOptional);
        }
        case 365: {
            LogStep(365, "Read attribute NULLABLE_CHAR_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableCharString::Id,
                                 true, chip::NullOptional);
        }
        case 366: {
            LogStep(366, "Write attribute NULLABLE_CHAR_STRING - Value too long");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::CharSpan> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableCharString::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 367: {
            LogStep(367, "Read attribute NULLABLE_CHAR_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableCharString::Id,
                                 true, chip::NullOptional);
        }
        case 368: {
            LogStep(368, "Write attribute NULLABLE_CHAR_STRING - Empty");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::CharSpan> value;
            value.SetNonNull();
            value.Value() = chip::Span<const char>("garbage: not in length on purpose", 0);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableCharString::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 369: {
            LogStep(369, "Read attribute NULLABLE_CHAR_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableCharString::Id,
                                 true, chip::NullOptional);
        }
        case 370: {
            LogStep(370, "Read attribute NULLABLE_CHAR_STRING not ☉T☉");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableCharString::Id,
                                 true, chip::NullOptional);
        }
        case 371: {
            LogStep(371, "Read attribute from nonexistent endpoint.");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(200), UnitTesting::Id, UnitTesting::Attributes::ListInt8u::Id, true,
                                 chip::NullOptional);
        }
        case 372: {
            LogStep(372, "Read attribute from nonexistent cluster.");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), UnitTesting::Id, UnitTesting::Attributes::ListInt8u::Id, true,
                                 chip::NullOptional);
        }
        case 373: {
            LogStep(373, "Send a command that takes an optional parameter but do not set it.");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestSimpleOptionalArgumentRequest::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                               UnitTesting::Commands::TestSimpleOptionalArgumentRequest::Id, value, chip::NullOptional

            );
        }
        case 374: {
            LogStep(374, "Send a command that takes an optional parameter but do not set it.");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestSimpleOptionalArgumentRequest::Type value;
            value.arg1.Emplace();
            value.arg1.Value() = 1;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                               UnitTesting::Commands::TestSimpleOptionalArgumentRequest::Id, value, chip::NullOptional

            );
        }
        case 375: {
            LogStep(375, "Subscribe to list attribute");
            return SubscribeAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::ListInt8u::Id, 2, 5,
                                      true, chip::NullOptional, chip::NullOptional, /* autoResubscribe = */ chip::NullOptional);
        }
        case 376: {
            LogStep(376, "Write subscribed-to list attribute");
            ListFreer listFreer;
            chip::app::DataModel::List<const uint8_t> value;

            {
                auto * listHolder_0 = new ListHolder<uint8_t>(4);
                listFreer.add(listHolder_0);
                listHolder_0->mList[0] = 5U;
                listHolder_0->mList[1] = 6U;
                listHolder_0->mList[2] = 7U;
                listHolder_0->mList[3] = 8U;
                value                  = chip::app::DataModel::List<uint8_t>(listHolder_0->mList, 4);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::ListInt8u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 377: {
            LogStep(377, "Check for list attribute report");
            return WaitForReport();
        }
        case 378: {
            LogStep(378, "Read range-restricted unsigned 8-bit integer");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::RangeRestrictedInt8u::Id,
                                 true, chip::NullOptional);
        }
        case 379: {
            LogStep(379, "Write min value to a range-restricted unsigned 8-bit integer");
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt8u::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 380: {
            LogStep(380, "Write just-below-range value to a range-restricted unsigned 8-bit integer");
            ListFreer listFreer;
            uint8_t value;
            value = 19U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt8u::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 381: {
            LogStep(381, "Write just-above-range value to a range-restricted unsigned 8-bit integer");
            ListFreer listFreer;
            uint8_t value;
            value = 101U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt8u::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 382: {
            LogStep(382, "Write max value to a range-restricted unsigned 8-bit integer");
            ListFreer listFreer;
            uint8_t value;
            value = 255U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt8u::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 383: {
            LogStep(383, "Verify range-restricted unsigned 8-bit integer value has not changed");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::RangeRestrictedInt8u::Id,
                                 true, chip::NullOptional);
        }
        case 384: {
            LogStep(384, "Write min valid value to a range-restricted unsigned 8-bit integer");
            ListFreer listFreer;
            uint8_t value;
            value = 20U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt8u::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 385: {
            LogStep(385, "Verify range-restricted unsigned 8-bit integer value is at min valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::RangeRestrictedInt8u::Id,
                                 true, chip::NullOptional);
        }
        case 386: {
            LogStep(386, "Write max valid value to a range-restricted unsigned 8-bit integer");
            ListFreer listFreer;
            uint8_t value;
            value = 100U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt8u::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 387: {
            LogStep(387, "Verify range-restricted unsigned 8-bit integer value is at max valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::RangeRestrictedInt8u::Id,
                                 true, chip::NullOptional);
        }
        case 388: {
            LogStep(388, "Write middle valid value to a range-restricted unsigned 8-bit integer");
            ListFreer listFreer;
            uint8_t value;
            value = 50U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt8u::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 389: {
            LogStep(389, "Verify range-restricted unsigned 8-bit integer value is at mid valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::RangeRestrictedInt8u::Id,
                                 true, chip::NullOptional);
        }
        case 390: {
            LogStep(390, "Read range-restricted unsigned 16-bit integer");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::RangeRestrictedInt16u::Id, true, chip::NullOptional);
        }
        case 391: {
            LogStep(391, "Write min value to a range-restricted unsigned 16-bit integer");
            ListFreer listFreer;
            uint16_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt16u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 392: {
            LogStep(392, "Write just-below-range value to a range-restricted unsigned 16-bit integer");
            ListFreer listFreer;
            uint16_t value;
            value = 99U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt16u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 393: {
            LogStep(393, "Write just-above-range value to a range-restricted unsigned 16-bit integer");
            ListFreer listFreer;
            uint16_t value;
            value = 1001U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt16u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 394: {
            LogStep(394, "Write max value to a range-restricted unsigned 16-bit integer");
            ListFreer listFreer;
            uint16_t value;
            value = 65535U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt16u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 395: {
            LogStep(395, "Verify range-restricted unsigned 16-bit integer value has not changed");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::RangeRestrictedInt16u::Id, true, chip::NullOptional);
        }
        case 396: {
            LogStep(396, "Write min valid value to a range-restricted unsigned 16-bit integer");
            ListFreer listFreer;
            uint16_t value;
            value = 100U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt16u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 397: {
            LogStep(397, "Verify range-restricted unsigned 16-bit integer value is at min valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::RangeRestrictedInt16u::Id, true, chip::NullOptional);
        }
        case 398: {
            LogStep(398, "Write max valid value to a range-restricted unsigned 16-bit integer");
            ListFreer listFreer;
            uint16_t value;
            value = 1000U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt16u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 399: {
            LogStep(399, "Verify range-restricted unsigned 16-bit integer value is at max valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::RangeRestrictedInt16u::Id, true, chip::NullOptional);
        }
        case 400: {
            LogStep(400, "Write middle valid value to a range-restricted unsigned 16-bit integer");
            ListFreer listFreer;
            uint16_t value;
            value = 500U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt16u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 401: {
            LogStep(401, "Verify range-restricted unsigned 16-bit integer value is at mid valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::RangeRestrictedInt16u::Id, true, chip::NullOptional);
        }
        case 402: {
            LogStep(402, "Read range-restricted signed 8-bit integer");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::RangeRestrictedInt8s::Id,
                                 true, chip::NullOptional);
        }
        case 403: {
            LogStep(403, "Write min value to a range-restricted signed 8-bit integer");
            ListFreer listFreer;
            int8_t value;
            value = -128;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt8s::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 404: {
            LogStep(404, "Write just-below-range value to a range-restricted signed 8-bit integer");
            ListFreer listFreer;
            int8_t value;
            value = -41;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt8s::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 405: {
            LogStep(405, "Write just-above-range value to a range-restricted signed 8-bit integer");
            ListFreer listFreer;
            int8_t value;
            value = 51;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt8s::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 406: {
            LogStep(406, "Write max value to a range-restricted signed 8-bit integer");
            ListFreer listFreer;
            int8_t value;
            value = 127;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt8s::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 407: {
            LogStep(407, "Verify range-restricted signed 8-bit integer value has not changed");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::RangeRestrictedInt8s::Id,
                                 true, chip::NullOptional);
        }
        case 408: {
            LogStep(408, "Write min valid value to a range-restricted signed 8-bit integer");
            ListFreer listFreer;
            int8_t value;
            value = -40;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt8s::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 409: {
            LogStep(409, "Verify range-restricted signed 8-bit integer value is at min valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::RangeRestrictedInt8s::Id,
                                 true, chip::NullOptional);
        }
        case 410: {
            LogStep(410, "Write max valid value to a range-restricted signed 8-bit integer");
            ListFreer listFreer;
            int8_t value;
            value = 50;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt8s::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 411: {
            LogStep(411, "Verify range-restricted signed 8-bit integer value is at max valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::RangeRestrictedInt8s::Id,
                                 true, chip::NullOptional);
        }
        case 412: {
            LogStep(412, "Write middle valid value to a range-restricted signed 8-bit integer");
            ListFreer listFreer;
            int8_t value;
            value = 6;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt8s::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 413: {
            LogStep(413, "Verify range-restricted signed 8-bit integer value is at mid valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::RangeRestrictedInt8s::Id,
                                 true, chip::NullOptional);
        }
        case 414: {
            LogStep(414, "Read range-restricted signed 16-bit integer");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::RangeRestrictedInt16s::Id, true, chip::NullOptional);
        }
        case 415: {
            LogStep(415, "Write min value to a range-restricted signed 16-bit integer");
            ListFreer listFreer;
            int16_t value;
            value = -32768;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt16s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 416: {
            LogStep(416, "Write just-below-range value to a range-restricted signed 16-bit integer");
            ListFreer listFreer;
            int16_t value;
            value = -151;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt16s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 417: {
            LogStep(417, "Write just-above-range value to a range-restricted signed 16-bit integer");
            ListFreer listFreer;
            int16_t value;
            value = 201;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt16s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 418: {
            LogStep(418, "Write max value to a range-restricted signed 16-bit integer");
            ListFreer listFreer;
            int16_t value;
            value = 32767;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt16s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 419: {
            LogStep(419, "Verify range-restricted signed 16-bit integer value has not changed");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::RangeRestrictedInt16s::Id, true, chip::NullOptional);
        }
        case 420: {
            LogStep(420, "Write min valid value to a range-restricted signed 16-bit integer");
            ListFreer listFreer;
            int16_t value;
            value = -150;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt16s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 421: {
            LogStep(421, "Verify range-restricted signed 16-bit integer value is at min valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::RangeRestrictedInt16s::Id, true, chip::NullOptional);
        }
        case 422: {
            LogStep(422, "Write max valid value to a range-restricted signed 16-bit integer");
            ListFreer listFreer;
            int16_t value;
            value = 200;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt16s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 423: {
            LogStep(423, "Verify range-restricted signed 16-bit integer value is at max valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::RangeRestrictedInt16s::Id, true, chip::NullOptional);
        }
        case 424: {
            LogStep(424, "Write middle valid value to a range-restricted signed 16-bit integer");
            ListFreer listFreer;
            int16_t value;
            value = 7;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt16s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 425: {
            LogStep(425, "Verify range-restricted signed 16-bit integer value is at mid valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::RangeRestrictedInt16s::Id, true, chip::NullOptional);
        }
        case 426: {
            LogStep(426, "Read nullable range-restricted unsigned 8-bit integer");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt8u::Id, true, chip::NullOptional);
        }
        case 427: {
            LogStep(427, "Write min value to a nullable range-restricted unsigned 8-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt8u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 428: {
            LogStep(428, "Write just-below-range value to a nullable range-restricted unsigned 8-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 19U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt8u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 429: {
            LogStep(429, "Write just-above-range value to a nullable range-restricted unsigned 8-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 101U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt8u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 430: {
            LogStep(430, "Write max value to a nullable range-restricted unsigned 8-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 254U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt8u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 431: {
            LogStep(431, "Verify nullable range-restricted unsigned 8-bit integer value has not changed");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt8u::Id, true, chip::NullOptional);
        }
        case 432: {
            LogStep(432, "Write min valid value to a nullable range-restricted unsigned 8-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 20U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt8u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 433: {
            LogStep(433, "Verify nullable range-restricted unsigned 8-bit integer value is at min valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt8u::Id, true, chip::NullOptional);
        }
        case 434: {
            LogStep(434, "Write max valid value to a nullable range-restricted unsigned 8-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 100U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt8u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 435: {
            LogStep(435, "Verify nullable range-restricted unsigned 8-bit integer value is at max valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt8u::Id, true, chip::NullOptional);
        }
        case 436: {
            LogStep(436, "Write middle valid value to a nullable range-restricted unsigned 8-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 50U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt8u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 437: {
            LogStep(437, "Verify nullable range-restricted unsigned 8-bit integer value is at mid valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt8u::Id, true, chip::NullOptional);
        }
        case 438: {
            LogStep(438, "Write null value to a nullable range-restricted unsigned 8-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt8u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 439: {
            LogStep(439, "Verify nullable range-restricted unsigned 8-bit integer value is null");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt8u::Id, true, chip::NullOptional);
        }
        case 440: {
            LogStep(440, "Read nullable range-restricted unsigned 16-bit integer");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt16u::Id, true, chip::NullOptional);
        }
        case 441: {
            LogStep(441, "Write min value to a nullable range-restricted unsigned 16-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint16_t> value;
            value.SetNonNull();
            value.Value() = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt16u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 442: {
            LogStep(442, "Write just-below-range value to a nullable range-restricted unsigned 16-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint16_t> value;
            value.SetNonNull();
            value.Value() = 99U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt16u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 443: {
            LogStep(443, "Write just-above-range value to a nullable range-restricted unsigned 16-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint16_t> value;
            value.SetNonNull();
            value.Value() = 1001U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt16u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 444: {
            LogStep(444, "Write max value to a nullable range-restricted unsigned 16-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint16_t> value;
            value.SetNonNull();
            value.Value() = 65534U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt16u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 445: {
            LogStep(445, "Verify nullable range-restricted unsigned 16-bit integer value has not changed");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt16u::Id, true, chip::NullOptional);
        }
        case 446: {
            LogStep(446, "Write min valid value to a nullable range-restricted unsigned 16-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint16_t> value;
            value.SetNonNull();
            value.Value() = 100U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt16u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 447: {
            LogStep(447, "Verify nullable range-restricted unsigned 16-bit integer value is at min valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt16u::Id, true, chip::NullOptional);
        }
        case 448: {
            LogStep(448, "Write max valid value to a nullable range-restricted unsigned 16-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint16_t> value;
            value.SetNonNull();
            value.Value() = 1000U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt16u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 449: {
            LogStep(449, "Verify nullable range-restricted unsigned 16-bit integer value is at max valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt16u::Id, true, chip::NullOptional);
        }
        case 450: {
            LogStep(450, "Write middle valid value to a nullable range-restricted unsigned 16-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint16_t> value;
            value.SetNonNull();
            value.Value() = 500U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt16u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 451: {
            LogStep(451, "Verify nullable range-restricted unsigned 16-bit integer value is at mid valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt16u::Id, true, chip::NullOptional);
        }
        case 452: {
            LogStep(452, "Write null value to a nullable range-restricted unsigned 16-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint16_t> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt16u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 453: {
            LogStep(453, "Verify nullable range-restricted unsigned 16-bit integer value is null");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt16u::Id, true, chip::NullOptional);
        }
        case 454: {
            LogStep(454, "Read nullable range-restricted signed 8-bit integer");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt8s::Id, true, chip::NullOptional);
        }
        case 455: {
            LogStep(455, "Write min value to a nullable range-restricted signed 8-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int8_t> value;
            value.SetNonNull();
            value.Value() = -127;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt8s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 456: {
            LogStep(456, "Write just-below-range value to a nullable range-restricted signed 8-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int8_t> value;
            value.SetNonNull();
            value.Value() = -41;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt8s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 457: {
            LogStep(457, "Write just-above-range value to a nullable range-restricted signed 8-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int8_t> value;
            value.SetNonNull();
            value.Value() = 51;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt8s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 458: {
            LogStep(458, "Write max value to a nullable range-restricted signed 8-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int8_t> value;
            value.SetNonNull();
            value.Value() = 127;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt8s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 459: {
            LogStep(459, "Verify nullable range-restricted signed 8-bit integer value has not changed");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt8s::Id, true, chip::NullOptional);
        }
        case 460: {
            LogStep(460, "Write min valid value to a nullable range-restricted signed 8-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int8_t> value;
            value.SetNonNull();
            value.Value() = -40;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt8s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 461: {
            LogStep(461, "Verify nullable range-restricted signed 8-bit integer value is at min valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt8s::Id, true, chip::NullOptional);
        }
        case 462: {
            LogStep(462, "Write max valid value to a nullable range-restricted signed 8-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int8_t> value;
            value.SetNonNull();
            value.Value() = 50;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt8s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 463: {
            LogStep(463, "Verify nullable range-restricted signed 8-bit integer value is at max valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt8s::Id, true, chip::NullOptional);
        }
        case 464: {
            LogStep(464, "Write middle valid value to a nullable range-restricted signed 8-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int8_t> value;
            value.SetNonNull();
            value.Value() = 6;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt8s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 465: {
            LogStep(465, "Verify nullable range-restricted signed 8-bit integer value is at mid valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt8s::Id, true, chip::NullOptional);
        }
        case 466: {
            LogStep(466, "Write null value to a nullable range-restricted signed 8-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int8_t> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt8s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 467: {
            LogStep(467, "Verify nullable range-restricted signed 8-bit integer value is at null");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt8s::Id, true, chip::NullOptional);
        }
        case 468: {
            LogStep(468, "Read nullable range-restricted signed 16-bit integer");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt16s::Id, true, chip::NullOptional);
        }
        case 469: {
            LogStep(469, "Write min value to a nullable range-restricted signed 16-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int16_t> value;
            value.SetNonNull();
            value.Value() = -32767;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt16s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 470: {
            LogStep(470, "Write just-below-range value to a nullable range-restricted signed 16-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int16_t> value;
            value.SetNonNull();
            value.Value() = -151;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt16s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 471: {
            LogStep(471, "Write just-above-range value to a nullable range-restricted signed 16-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int16_t> value;
            value.SetNonNull();
            value.Value() = 201;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt16s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 472: {
            LogStep(472, "Write max value to a nullable range-restricted signed 16-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int16_t> value;
            value.SetNonNull();
            value.Value() = 32767;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt16s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 473: {
            LogStep(473, "Verify nullable range-restricted signed 16-bit integer value has not changed");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt16s::Id, true, chip::NullOptional);
        }
        case 474: {
            LogStep(474, "Write min valid value to a nullable range-restricted signed 16-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int16_t> value;
            value.SetNonNull();
            value.Value() = -150;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt16s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 475: {
            LogStep(475, "Verify nullable range-restricted signed 16-bit integer value is at min valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt16s::Id, true, chip::NullOptional);
        }
        case 476: {
            LogStep(476, "Write max valid value to a nullable range-restricted signed 16-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int16_t> value;
            value.SetNonNull();
            value.Value() = 200;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt16s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 477: {
            LogStep(477, "Verify nullable range-restricted signed 16-bit integer value is at max valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt16s::Id, true, chip::NullOptional);
        }
        case 478: {
            LogStep(478, "Write middle valid value to a nullable range-restricted signed 16-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int16_t> value;
            value.SetNonNull();
            value.Value() = 7;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt16s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 479: {
            LogStep(479, "Verify nullable range-restricted signed 16-bit integer value is at mid valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt16s::Id, true, chip::NullOptional);
        }
        case 480: {
            LogStep(480, "Write null value to a nullable range-restricted signed 16-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int16_t> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt16s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 481: {
            LogStep(481, "Verify nullable range-restricted signed 16-bit integer value is null");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt16s::Id, true, chip::NullOptional);
        }
        case 482: {
            LogStep(482, "Write attribute that returns general status on write");
            ListFreer listFreer;
            bool value;
            value = false;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::GeneralErrorBoolean::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 483: {
            LogStep(483, "Write attribute that returns cluster-specific status on write");
            ListFreer listFreer;
            bool value;
            value = false;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::ClusterErrorBoolean::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 484: {
            LogStep(484, "Read attribute that returns general status on read");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::GeneralErrorBoolean::Id,
                                 true, chip::NullOptional);
        }
        case 485: {
            LogStep(485, "read attribute that returns cluster-specific status on read");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::ClusterErrorBoolean::Id,
                                 true, chip::NullOptional);
        }
        case 486: {
            LogStep(486, "read AcceptedCommandList attribute");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::AcceptedCommandList::Id,
                                 true, chip::NullOptional);
        }
        case 487: {
            LogStep(487, "read GeneratedCommandList attribute");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::GeneratedCommandList::Id,
                                 true, chip::NullOptional);
        }
        case 488: {
            LogStep(488, "Write struct-typed attribute");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Structs::SimpleStruct::Type value;

            value.a = 5U;
            value.b = true;
            value.c = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(2);
            value.d = chip::ByteSpan(chip::Uint8::from_const_char("abcgarbage: not in length on purpose"), 3);
            value.e = chip::Span<const char>("garbage: not in length on purpose", 0);
            value.f = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::SimpleBitmap>>(17U);
            value.g = 1.5f;
            value.h = 3.14159265358979;

            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::StructAttr::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 489: {
            LogStep(489, "Read struct-typed attribute");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::StructAttr::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestClusterComplexTypesSuite : public TestCommand
{
public:
    TestClusterComplexTypesSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestClusterComplexTypes", 21, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestClusterComplexTypesSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::TestNullableOptionalResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("wasPresent", value.wasPresent, true));
                VerifyOrReturn(CheckValuePresent("wasNull", value.wasNull));
                VerifyOrReturn(CheckValue("wasNull.Value()", value.wasNull.Value(), true));
                VerifyOrReturn(CheckValuePresent("originalValue", value.originalValue));
                VerifyOrReturn(CheckValueNull("originalValue.Value()", value.originalValue.Value()));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_NEEDS_TIMED_INTERACTION));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_ACCESS));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_ACCESS));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("timedWriteBoolean", value, false));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_NEEDS_TIMED_INTERACTION));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("timedWriteBoolean", value, false));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_ACCESS));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("timedWriteBoolean", value, false));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("timedWriteBoolean", value, true));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("boolean", value, false));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_ACCESS));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("boolean", value, false));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("boolean", value, true));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Send Test Command with optional arg set to null.");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestNullableOptionalRequest::Type value;
            value.arg1.Emplace();
            value.arg1.Value().SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                               UnitTesting::Commands::TestNullableOptionalRequest::Id, value, chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Send command that needs timed invoke without a timeout value");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TimedInvokeRequest::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Commands::TimedInvokeRequest::Id,
                               value, chip::NullOptional, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "Send command that needs timed invoke with a long timeout value");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TimedInvokeRequest::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Commands::TimedInvokeRequest::Id,
                               value, chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Send command that needs timed invoke with a too-short timeout value");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TimedInvokeRequest::Type value;
            ReturnErrorOnFailure(SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                             UnitTesting::Commands::TimedInvokeRequest::Id, value, chip::Optional<uint16_t>(1),
                                             chip::NullOptional

                                             ));

            using namespace chip::System::Clock::Literals;
            return BusyWaitFor(100_ms);
        }
        case 5: {
            LogStep(5, "Send command that does not need timed invoke with a long timeout value");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::Test::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Commands::Test::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Send command that does not need timed invoke with a too-short timeout value");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::Test::Type value;
            ReturnErrorOnFailure(SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Commands::Test::Id,
                                             value, chip::Optional<uint16_t>(1), chip::NullOptional

                                             ));

            using namespace chip::System::Clock::Literals;
            return BusyWaitFor(100_ms);
        }
        case 7: {
            LogStep(7, "Read attribute that needs timed write initial state");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::TimedWriteBoolean::Id,
                                 true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Write attribute that needs timed write without a timeout value");
            ListFreer listFreer;
            bool value;
            value = true;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::TimedWriteBoolean::Id,
                                  value, chip::NullOptional, chip::NullOptional, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Read attribute that needs timed write state unchanged 1");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::TimedWriteBoolean::Id,
                                 true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Write attribute that needs timed write with a too-short timeout value");
            ListFreer listFreer;
            bool value;
            value = true;
            ReturnErrorOnFailure(WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                                UnitTesting::Attributes::TimedWriteBoolean::Id, value, chip::Optional<uint16_t>(1),
                                                chip::NullOptional, chip::NullOptional));

            using namespace chip::System::Clock::Literals;
            return BusyWaitFor(100_ms);
        }
        case 11: {
            LogStep(11, "Read attribute that needs timed write state unchanged 2");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::TimedWriteBoolean::Id,
                                 true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Write attribute that needs timed write with a long timeout value");
            ListFreer listFreer;
            bool value;
            value = true;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::TimedWriteBoolean::Id,
                                  value, chip::Optional<uint16_t>(10000), chip::NullOptional, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Read attribute that needs timed write state changed");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::TimedWriteBoolean::Id,
                                 true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Write attribute that needs timed write reset to default");
            ListFreer listFreer;
            bool value;
            value = false;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::TimedWriteBoolean::Id,
                                  value, chip::Optional<uint16_t>(10000), chip::NullOptional, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Read attribute that does not need timed write initial value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Boolean::Id, true,
                                 chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Write attribute that does not need timed write with a too-short timeout value");
            ListFreer listFreer;
            bool value;
            value = true;
            ReturnErrorOnFailure(WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                                UnitTesting::Attributes::Boolean::Id, value, chip::Optional<uint16_t>(1),
                                                chip::NullOptional, chip::NullOptional));

            using namespace chip::System::Clock::Literals;
            return BusyWaitFor(100_ms);
        }
        case 17: {
            LogStep(17, "Read attribute that does not need timed write unchanged value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Boolean::Id, true,
                                 chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Write attribute that does not need timed write with a long timeout value");
            ListFreer listFreer;
            bool value;
            value = true;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Boolean::Id, value,
                                  chip::Optional<uint16_t>(10000), chip::NullOptional, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Read attribute that does not need timed write changed value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Boolean::Id, true,
                                 chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Write attribute that does not need timed write reset to default");
            ListFreer listFreer;
            bool value;
            value = false;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Boolean::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestConstraintsSuite : public TestCommand
{
public:
    TestConstraintsSuite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("TestConstraints", 32, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestConstraintsSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintContains("value", value, 2U));
                VerifyOrReturn(CheckConstraintContains("value", value, 3U));
                VerifyOrReturn(CheckConstraintContains("value", value, 4U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintExcludes("value", value, 0U));
                VerifyOrReturn(CheckConstraintExcludes("value", value, 5U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap32", value, 0UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap32", value, 5UL));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 2UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap32", value, 5UL));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap32", value, 5UL));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 4UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap32", value, 5UL));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 4UL));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 5UL));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 5UL));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, 6UL));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinLength("value", value, 5));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 20));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintStartsWith("value", value, "**"));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintEndsWith("value", value, "**"));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintIsLowerCase("value", value, true));
                VerifyOrReturn(CheckConstraintIsUpperCase("value", value, false));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintIsUpperCase("value", value, true));
                VerifyOrReturn(CheckConstraintIsLowerCase("value", value, false));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintIsUpperCase("value", value, false));
                VerifyOrReturn(CheckConstraintIsLowerCase("value", value, false));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintIsHexString("value", value, false));
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintIsHexString("value", value, true));
            }
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Write attribute LIST With List of INT8U");
            ListFreer listFreer;
            chip::app::DataModel::List<const uint8_t> value;

            {
                auto * listHolder_0 = new ListHolder<uint8_t>(4);
                listFreer.add(listHolder_0);
                listHolder_0->mList[0] = 1U;
                listHolder_0->mList[1] = 2U;
                listHolder_0->mList[2] = 3U;
                listHolder_0->mList[3] = 4U;
                value                  = chip::app::DataModel::List<uint8_t>(listHolder_0->mList, 4);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::ListInt8u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read attribute LIST With Partial List of INT8U that should be in it");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::ListInt8u::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read attribute LIST With Partial List of INT8U that should not be included");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::ListInt8u::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Write attribute LIST Back to Default Value");
            ListFreer listFreer;
            chip::app::DataModel::List<const uint8_t> value;

            value = chip::app::DataModel::List<uint8_t>();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::ListInt8u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read attribute BITMAP32 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap32::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Write attribute BITMAP32 with MaskVal1 and MaskVal3");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap>>(5UL);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap32::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read attribute BITMAP32 with MaskVal1 and MaskVal3 and ensure MaskVal2 is not set");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap32::Id, true,
                                 chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read attribute BITMAP32 with MaskVal1 and MaskVal3 and ensure MaskVal1 is set");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap32::Id, true,
                                 chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Read attribute BITMAP32 with MaskVal1 and MaskVal3 and ensure MaskVal3 is set");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap32::Id, true,
                                 chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Read attribute BITMAP32 with MaskVal1 and MaskVal3 and ensure Maskval1 and MaskVal3 are set");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap32::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Write attribute INT32U Value");
            ListFreer listFreer;
            uint32_t value;
            value = 5UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Read attribute INT32U Value MinValue Constraints");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32u::Id, true,
                                 chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Read attribute INT32U Value MaxValue Constraints");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32u::Id, true,
                                 chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Read attribute INT32U Value NotValue Constraints");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32u::Id, true,
                                 chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Write attribute INT32U Value Back to Default Value");
            ListFreer listFreer;
            uint32_t value;
            value = 0UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Write attribute CHAR_STRING Value");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("** Test **garbage: not in length on purpose", 10);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Read attribute CHAR_STRING Value MinLength Constraints");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, true,
                                 chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Read attribute CHAR_STRING Value MaxLength Constraints");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, true,
                                 chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Read attribute CHAR_STRING Value StartsWith Constraints");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, true,
                                 chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Read attribute CHAR_STRING Value EndsWith Constraints");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, true,
                                 chip::NullOptional);
        }
        case 21: {
            LogStep(21, "Write attribute CHAR_STRING Value");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("lowercasegarbage: not in length on purpose", 9);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Read attribute CHAR_STRING Value isLowerCase/isUpperCase Constraints");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, true,
                                 chip::NullOptional);
        }
        case 23: {
            LogStep(23, "Write attribute CHAR_STRING Value");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("UPPERCASEgarbage: not in length on purpose", 9);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 24: {
            LogStep(24, "Read attribute CHAR_STRING Value isLowerCase/isUpperCase Constraints");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, true,
                                 chip::NullOptional);
        }
        case 25: {
            LogStep(25, "Write attribute CHAR_STRING Value");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("lowUPPERgarbage: not in length on purpose", 8);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 26: {
            LogStep(26, "Read attribute CHAR_STRING Value isLowerCase/isUpperCase Constraints");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, true,
                                 chip::NullOptional);
        }
        case 27: {
            LogStep(27, "Write attribute CHAR_STRING Value");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("ABCDEF012Vgarbage: not in length on purpose", 10);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 28: {
            LogStep(28, "Read attribute CHAR_STRING Value isHexString Constraints");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, true,
                                 chip::NullOptional);
        }
        case 29: {
            LogStep(29, "Write attribute CHAR_STRING Value");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("ABCDEF0123garbage: not in length on purpose", 10);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 30: {
            LogStep(30, "Read attribute CHAR_STRING Value isHexString Constraints");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, true,
                                 chip::NullOptional);
        }
        case 31: {
            LogStep(31, "Write attribute CHAR_STRING Value Back to Default Value");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("garbage: not in length on purpose", 0);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestDelayCommandsSuite : public TestCommand
{
public:
    TestDelayCommandsSuite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("TestDelayCommands", 2, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestDelayCommandsSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestEventsSuite : public TestCommand
{
public:
    TestEventsSuite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("TestEvents", 12, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestEventsSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    uint64_t eventNumber;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            switch (mTestSubStepIndex)
            {
            default:
                LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
                break;
            }
            break;
        case 2:
            switch (mTestSubStepIndex)
            {
            default:
                LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
                break;
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::TestEmitTestEventResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                eventNumber = value.value;
            }
            break;
        case 4:
            switch (mTestSubStepIndex)
            {
            case 0:
                VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
                {
                    chip::app::Clusters::UnitTesting::Events::TestEvent::DecodableType value;
                    VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                    VerifyOrReturn(CheckValue("testEvent.arg1", value.arg1, 1U));
                    VerifyOrReturn(CheckValue("testEvent.arg2", value.arg2, 2U));
                    VerifyOrReturn(CheckValue("testEvent.arg3", value.arg3, true));
                }
                mTestSubStepIndex++;
                break;
            default:
                LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
                break;
            }
            break;
        case 5:
            switch (mTestSubStepIndex)
            {
            case 0:
                VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
                {
                    chip::app::Clusters::UnitTesting::Events::TestEvent::DecodableType value;
                    VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                    VerifyOrReturn(CheckValue("testEvent.arg1", value.arg1, 1U));
                    VerifyOrReturn(CheckValue("testEvent.arg2", value.arg2, 2U));
                    VerifyOrReturn(CheckValue("testEvent.arg3", value.arg3, true));
                }
                mTestSubStepIndex++;
                break;
            default:
                LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
                break;
            }
            break;
        case 6:
            switch (mTestSubStepIndex)
            {
            default:
                LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
                break;
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::TestEmitTestEventResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("value", value.value, static_cast<uint64_t>(eventNumber + 1)));
            }
            break;
        case 8:
            switch (mTestSubStepIndex)
            {
            case 0:
                VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
                {
                    chip::app::Clusters::UnitTesting::Events::TestEvent::DecodableType value;
                    VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                    VerifyOrReturn(CheckValue("testEvent.arg1", value.arg1, 1U));
                    VerifyOrReturn(CheckValue("testEvent.arg2", value.arg2, 2U));
                    VerifyOrReturn(CheckValue("testEvent.arg3", value.arg3, true));
                }
                mTestSubStepIndex++;
                break;
            case 1:
                VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
                {
                    chip::app::Clusters::UnitTesting::Events::TestEvent::DecodableType value;
                    VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                    VerifyOrReturn(CheckValue("testEvent.arg1", value.arg1, 3U));
                    VerifyOrReturn(CheckValue("testEvent.arg2", value.arg2, 4U));
                    VerifyOrReturn(CheckValue("testEvent.arg3", value.arg3, false));
                }
                mTestSubStepIndex++;
                break;
            default:
                LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
                break;
            }
            break;
        case 9:
            switch (mTestSubStepIndex)
            {
            case 0:
                VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
                {
                    chip::app::Clusters::UnitTesting::Events::TestEvent::DecodableType value;
                    VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                    VerifyOrReturn(CheckValue("testEvent.arg1", value.arg1, 1U));
                    VerifyOrReturn(CheckValue("testEvent.arg2", value.arg2, 2U));
                    VerifyOrReturn(CheckValue("testEvent.arg3", value.arg3, true));
                }
                mTestSubStepIndex++;
                break;
            case 1:
                VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
                {
                    chip::app::Clusters::UnitTesting::Events::TestEvent::DecodableType value;
                    VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                    VerifyOrReturn(CheckValue("testEvent.arg1", value.arg1, 3U));
                    VerifyOrReturn(CheckValue("testEvent.arg2", value.arg2, 4U));
                    VerifyOrReturn(CheckValue("testEvent.arg3", value.arg3, false));
                }
                mTestSubStepIndex++;
                break;
            default:
                LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
                break;
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::TestEmitTestEventResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("value", value.value, static_cast<uint64_t>(eventNumber + 2)));
            }
            break;
        case 11:
            switch (mTestSubStepIndex)
            {
            case 0:
                VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
                {
                    chip::app::Clusters::UnitTesting::Events::TestEvent::DecodableType value;
                    VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                    VerifyOrReturn(CheckValue("testEvent.arg1", value.arg1, 4U));
                    VerifyOrReturn(CheckValue("testEvent.arg2", value.arg2, 3U));
                    VerifyOrReturn(CheckValue("testEvent.arg3", value.arg3, true));
                }
                shouldContinue = true;
                mTestSubStepIndex++;
                break;
            default:
                LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
                break;
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Check there is no event on the target endpoint");
            mTestSubStepCount = 0;
            return ReadEvent(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Events::TestEvent::Id, false,
                             chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Check reading events from an invalid endpoint");
            mTestSubStepCount = 0;
            return ReadEvent(kIdentityAlpha, GetEndpoint(0), UnitTesting::Id, UnitTesting::Events::TestEvent::Id, false,
                             chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Generate an event on the accessory");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestEmitTestEventRequest::Type value;
            value.arg1 = 1U;
            value.arg2 = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(2);
            value.arg3 = true;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Commands::TestEmitTestEventRequest::Id,
                               value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Read the event back");
            mTestSubStepCount = 1;
            return ReadEvent(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Events::TestEvent::Id, false,
                             chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the event with eventNumber set to the event value");
            mTestSubStepCount = 1;
            return ReadEvent(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Events::TestEvent::Id, false,
                             chip::Optional<chip::EventNumber>(eventNumber));
        }
        case 6: {
            LogStep(6, "Read the event with eventNumber set to the event value + 1");
            mTestSubStepCount = 0;
            return ReadEvent(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Events::TestEvent::Id, false,
                             chip::Optional<chip::EventNumber>(eventNumber + 1));
        }
        case 7: {
            LogStep(7, "Generate a second event on the accessory");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestEmitTestEventRequest::Type value;
            value.arg1 = 3U;
            value.arg2 = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(4);
            value.arg3 = false;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Commands::TestEmitTestEventRequest::Id,
                               value, chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "Read the event back");
            mTestSubStepCount = 2;
            return ReadEvent(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Events::TestEvent::Id, false,
                             chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Subscribe to the event");
            mTestSubStepCount = 2;
            return SubscribeEvent(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Events::TestEvent::Id, 3, 5, false,
                                  chip::NullOptional, chip::NullOptional, /* autoResubscribe = */ chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Generate a third event on the accessory");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestEmitTestEventRequest::Type value;
            value.arg1 = 4U;
            value.arg2 = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(3);
            value.arg3 = true;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Commands::TestEmitTestEventRequest::Id,
                               value, chip::NullOptional

            );
        }
        case 11: {
            LogStep(11, "Check for event report");
            mTestSubStepCount = 1;
            return WaitForReport();
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestDiscoverySuite : public TestCommand
{
public:
    TestDiscoverySuite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("TestDiscovery", 27, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("discriminator", 0, UINT16_MAX, &mDiscriminator);
        AddArgument("vendorId", 0, UINT16_MAX, &mVendorId);
        AddArgument("productId", 0, UINT16_MAX, &mProductId);
        AddArgument("deviceType", 0, UINT16_MAX, &mDeviceType);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestDiscoverySuite()
    {
        if (deviceInstanceNameBeforeRebootBuffer != nullptr)
        {
            chip::Platform::MemoryFree(deviceInstanceNameBeforeRebootBuffer);
            deviceInstanceNameBeforeRebootBuffer = nullptr;
        }
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mDiscriminator;
    chip::Optional<uint16_t> mVendorId;
    chip::Optional<uint16_t> mProductId;
    chip::Optional<uint16_t> mDeviceType;
    chip::Optional<uint16_t> mTimeout;

    char * deviceInstanceNameBeforeRebootBuffer = nullptr;
    chip::CharSpan deviceInstanceNameBeforeReboot;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DiscoveryCommands::Commands::DiscoveryCommandResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinLength("value.instanceName", value.instanceName, 16));
                VerifyOrReturn(CheckConstraintMaxLength("value.instanceName", value.instanceName, 16));
                VerifyOrReturn(CheckConstraintIsUpperCase("value.instanceName", value.instanceName, true));
                VerifyOrReturn(CheckConstraintIsHexString("value.instanceName", value.instanceName, true));
                if (deviceInstanceNameBeforeRebootBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(deviceInstanceNameBeforeRebootBuffer);
                }
                deviceInstanceNameBeforeRebootBuffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.instanceName.size()));
                memcpy(deviceInstanceNameBeforeRebootBuffer, value.instanceName.data(), value.instanceName.size());
                deviceInstanceNameBeforeReboot = chip::CharSpan(deviceInstanceNameBeforeRebootBuffer, value.instanceName.size());
            }
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DiscoveryCommands::Commands::DiscoveryCommandResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DiscoveryCommands::Commands::DiscoveryCommandResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DiscoveryCommands::Commands::DiscoveryCommandResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DiscoveryCommands::Commands::DiscoveryCommandResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DiscoveryCommands::Commands::DiscoveryCommandResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("longDiscriminator", value.longDiscriminator,
                                          mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840U));
                VerifyOrReturn(CheckConstraintMinValue("value.longDiscriminator", value.longDiscriminator, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value.longDiscriminator", value.longDiscriminator, 4096U));
            }
            shouldContinue = true;
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DiscoveryCommands::Commands::DiscoveryCommandResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("vendorId", value.vendorId, mVendorId.HasValue() ? mVendorId.Value() : 65521U));
            }
            shouldContinue = true;
            break;
        case 13:
            if (IsUnsupported(status.mStatus))
            {
                shouldContinue = true;
                return;
            }
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DiscoveryCommands::Commands::DiscoveryCommandResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("productId", value.productId, mProductId.HasValue() ? mProductId.Value() : 32769U));
            }
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DiscoveryCommands::Commands::DiscoveryCommandResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                if (value.mrpRetryIntervalIdle.HasValue())
                {
                    VerifyOrReturn(CheckConstraintMaxValue("value.mrpRetryIntervalIdle.Value()", value.mrpRetryIntervalIdle.Value(),
                                                           3600000UL));
                }
            }
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DiscoveryCommands::Commands::DiscoveryCommandResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                if (value.mrpRetryIntervalActive.HasValue())
                {
                    VerifyOrReturn(CheckConstraintMaxValue("value.mrpRetryIntervalActive.Value()",
                                                           value.mrpRetryIntervalActive.Value(), 3600000UL));
                }
            }
            shouldContinue = true;
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DiscoveryCommands::Commands::DiscoveryCommandResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("commissioningMode", value.commissioningMode, 1U));
            }
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DiscoveryCommands::Commands::DiscoveryCommandResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMaxLength("value.deviceName", value.deviceName, 32));
            }
            shouldContinue = true;
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DiscoveryCommands::Commands::DiscoveryCommandResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMaxValue("value.rotatingIdLen", value.rotatingIdLen, 100ULL));
            }
            shouldContinue = true;
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DiscoveryCommands::Commands::DiscoveryCommandResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value.pairingHint", value.pairingHint, 0U));
            }
            shouldContinue = true;
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DiscoveryCommands::Commands::DiscoveryCommandResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMaxLength("value.pairingInstruction", value.pairingInstruction, 128));
            }
            shouldContinue = true;
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DiscoveryCommands::Commands::DiscoveryCommandResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value.numIPs", value.numIPs, 1U));
            }
            shouldContinue = true;
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DiscoveryCommands::Commands::DiscoveryCommandResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinLength("value.instanceName", value.instanceName, 16));
                VerifyOrReturn(CheckConstraintMaxLength("value.instanceName", value.instanceName, 16));
                VerifyOrReturn(CheckConstraintIsUpperCase("value.instanceName", value.instanceName, true));
                VerifyOrReturn(CheckConstraintIsHexString("value.instanceName", value.instanceName, true));
                VerifyOrReturn(CheckConstraintNotValue("value.instanceName", value.instanceName, deviceInstanceNameBeforeReboot));
            }
            shouldContinue = true;
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Stop target device");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Stop::Type value;
            return Stop(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Start target device with the provided discriminator for basic commissioning advertisement");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Start::Type value;
            value.discriminator.Emplace();
            value.discriminator.Value() = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840U;
            return Start(kIdentityAlpha, value);
        }
        case 2: {
            LogStep(2, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "Open Commissioning Window with too-short timeout");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 120U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Open Commissioning Window with too-long timeout");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 1000U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "Open Commissioning Window");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Check Instance Name");
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "Check Long Discriminator _L");
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionableByLongDiscriminator::Type value;
            value.value = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840ULL;
            return FindCommissionableByLongDiscriminator(kIdentityAlpha, value);
        }
        case 8: {
            LogStep(8, "Check Short Discriminator (_S)");
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionableByShortDiscriminator::Type value;
            value.value = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840ULL;
            return FindCommissionableByShortDiscriminator(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "Check Commissioning Mode (_CM)");
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionableByCommissioningMode::Type value;
            return FindCommissionableByCommissioningMode(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "Check Vendor ID (_V)");
            VerifyOrDo(!ShouldSkip("VENDOR_SUBTYPE"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionableByVendorId::Type value;
            value.value = mVendorId.HasValue() ? mVendorId.Value() : 65521ULL;
            return FindCommissionableByVendorId(kIdentityAlpha, value);
        }
        case 11: {
            LogStep(11, "TXT key for discriminator (D)");
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 12: {
            LogStep(12, "TXT key for Vendor ID and Product ID (VP)");
            VerifyOrDo(!ShouldSkip("VP_KEY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "TXT key for Vendor ID and Product ID (VP)");
            VerifyOrDo(!ShouldSkip("VP_KEY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14, "Optional TXT key for MRP Retry Interval Idle (CRI)");
            VerifyOrDo(!ShouldSkip("CRI_COMM_DISCOVERY_KEY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 15: {
            LogStep(15, "Optional TXT key for MRP Retry Interval Active (CRA)");
            VerifyOrDo(!ShouldSkip("CRA_COMM_DISCOVERY_KEY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 16: {
            LogStep(16, "TXT key for commissioning mode (CM)");
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17, "Optional TXT key for device name (DN)");
            VerifyOrDo(!ShouldSkip("DN_KEY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 18: {
            LogStep(18, "Optional TXT key for rotating device identifier (RI)");
            VerifyOrDo(!ShouldSkip("RI_KEY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 19: {
            LogStep(19, "Optional TXT key for pairing hint (PH)");
            VerifyOrDo(!ShouldSkip("PH_KEY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 20: {
            LogStep(20, "Optional TXT key for pairing instructions (PI)");
            VerifyOrDo(!ShouldSkip("PI_KEY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 21: {
            LogStep(21, "Check IPs");
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 22: {
            LogStep(22, "Stop target device");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Stop::Type value;
            return Stop(kIdentityAlpha, value);
        }
        case 23: {
            LogStep(23, "Start target device with the provided discriminator for basic commissioning advertisement");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Start::Type value;
            value.discriminator.Emplace();
            value.discriminator.Value() = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840U;
            return Start(kIdentityAlpha, value);
        }
        case 24: {
            LogStep(24, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 25: {
            LogStep(25, "Open Commissioning Window");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 26: {
            LogStep(26, "Check Instance Name");
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestLogCommandsSuite : public TestCommand
{
public:
    TestLogCommandsSuite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("TestLogCommands", 3, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestLogCommandsSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Log a simple message");
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::Log::Type value;
            value.message = chip::Span<const char>("This is a simple messagegarbage: not in length on purpose", 24);
            return Log(kIdentityAlpha, value);
        }
        case 2: {
            LogStep(2, "Do a simple user prompt message");
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("This is a simple messagegarbage: not in length on purpose", 24);
            return UserPrompt(kIdentityAlpha, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestSaveAsSuite : public TestCommand
{
public:
    TestSaveAsSuite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("TestSaveAs", 110, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestSaveAsSuite()
    {
        if (readAttributeCharStringDefaultValueBuffer != nullptr)
        {
            chip::Platform::MemoryFree(readAttributeCharStringDefaultValueBuffer);
            readAttributeCharStringDefaultValueBuffer = nullptr;
        }
        if (readAttributeCharStringNotDefaultValueBuffer != nullptr)
        {
            chip::Platform::MemoryFree(readAttributeCharStringNotDefaultValueBuffer);
            readAttributeCharStringNotDefaultValueBuffer = nullptr;
        }
        if (readAttributeOctetStringDefaultValueBuffer != nullptr)
        {
            chip::Platform::MemoryFree(readAttributeOctetStringDefaultValueBuffer);
            readAttributeOctetStringDefaultValueBuffer = nullptr;
        }
        if (readAttributeOctetStringNotDefaultValueBuffer != nullptr)
        {
            chip::Platform::MemoryFree(readAttributeOctetStringNotDefaultValueBuffer);
            readAttributeOctetStringNotDefaultValueBuffer = nullptr;
        }
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    uint8_t TestAddArgumentDefaultValue;
    bool readAttributeBooleanDefaultValue;
    chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap> readAttributeBitmap8DefaultValue;
    chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap> readAttributeBitmap16DefaultValue;
    chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap> readAttributeBitmap32DefaultValue;
    chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap> readAttributeBitmap64DefaultValue;
    uint8_t readAttributeInt8uDefaultValue;
    uint16_t readAttributeInt16uDefaultValue;
    uint32_t readAttributeInt32uDefaultValue;
    uint64_t readAttributeInt64uDefaultValue;
    int8_t readAttributeInt8sDefaultValue;
    int16_t readAttributeInt16sDefaultValue;
    int32_t readAttributeInt32sDefaultValue;
    int64_t readAttributeInt64sDefaultValue;
    uint8_t readAttributeEnum8DefaultValue;
    uint16_t readAttributeEnum16DefaultValue;
    uint64_t readAttributeEpochUSDefaultValue;
    uint32_t readAttributeEpochSDefaultValue;
    chip::VendorId readAttributeVendorIdDefaultValue;
    char * readAttributeCharStringDefaultValueBuffer = nullptr;
    chip::CharSpan readAttributeCharStringDefaultValue;
    char * readAttributeCharStringNotDefaultValueBuffer = nullptr;
    chip::CharSpan readAttributeCharStringNotDefaultValue;
    uint8_t * readAttributeOctetStringDefaultValueBuffer = nullptr;
    chip::ByteSpan readAttributeOctetStringDefaultValue;
    uint8_t * readAttributeOctetStringNotDefaultValueBuffer = nullptr;
    chip::ByteSpan readAttributeOctetStringNotDefaultValue;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::TestAddArgumentsResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("returnValue", value.returnValue, 20U));
                TestAddArgumentDefaultValue = value.returnValue;
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::TestAddArgumentsResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("returnValue", value.returnValue, TestAddArgumentDefaultValue));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::TestAddArgumentsResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value.returnValue", value.returnValue, TestAddArgumentDefaultValue));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("boolean", value, 0));
                readAttributeBooleanDefaultValue = value;
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readAttributeBooleanDefaultValue));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("boolean", value, readAttributeBooleanDefaultValue));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap8", value, 0U));
                readAttributeBitmap8DefaultValue = value;
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readAttributeBitmap8DefaultValue));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap8", value, readAttributeBitmap8DefaultValue));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap16", value, 0U));
                readAttributeBitmap16DefaultValue = value;
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readAttributeBitmap16DefaultValue));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap16", value, readAttributeBitmap16DefaultValue));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap32", value, 0UL));
                readAttributeBitmap32DefaultValue = value;
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readAttributeBitmap32DefaultValue));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap32", value, readAttributeBitmap32DefaultValue));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap64", value, 0ULL));
                readAttributeBitmap64DefaultValue = value;
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readAttributeBitmap64DefaultValue));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap64", value, readAttributeBitmap64DefaultValue));
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int8u", value, 0U));
                readAttributeInt8uDefaultValue = value;
            }
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readAttributeInt8uDefaultValue));
            }
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int8u", value, readAttributeInt8uDefaultValue));
            }
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int16u", value, 0U));
                readAttributeInt16uDefaultValue = value;
            }
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readAttributeInt16uDefaultValue));
            }
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int16u", value, readAttributeInt16uDefaultValue));
            }
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int32u", value, 0UL));
                readAttributeInt32uDefaultValue = value;
            }
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readAttributeInt32uDefaultValue));
            }
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int32u", value, readAttributeInt32uDefaultValue));
            }
            break;
        case 44:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int64u", value, 0ULL));
                readAttributeInt64uDefaultValue = value;
            }
            break;
        case 45:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readAttributeInt64uDefaultValue));
            }
            break;
        case 47:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 48:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int64u", value, readAttributeInt64uDefaultValue));
            }
            break;
        case 49:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int8s", value, 0));
                readAttributeInt8sDefaultValue = value;
            }
            break;
        case 50:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 51:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readAttributeInt8sDefaultValue));
            }
            break;
        case 52:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 53:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int8s", value, readAttributeInt8sDefaultValue));
            }
            break;
        case 54:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int16s", value, 0));
                readAttributeInt16sDefaultValue = value;
            }
            break;
        case 55:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 56:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readAttributeInt16sDefaultValue));
            }
            break;
        case 57:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 58:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int16s", value, readAttributeInt16sDefaultValue));
            }
            break;
        case 59:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int32s", value, 0L));
                readAttributeInt32sDefaultValue = value;
            }
            break;
        case 60:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 61:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readAttributeInt32sDefaultValue));
            }
            break;
        case 62:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 63:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int32s", value, readAttributeInt32sDefaultValue));
            }
            break;
        case 64:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int64s", value, 0LL));
                readAttributeInt64sDefaultValue = value;
            }
            break;
        case 65:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 66:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readAttributeInt64sDefaultValue));
            }
            break;
        case 67:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 68:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int64s", value, readAttributeInt64sDefaultValue));
            }
            break;
        case 69:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enum8", value, 0U));
                readAttributeEnum8DefaultValue = value;
            }
            break;
        case 70:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 71:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readAttributeEnum8DefaultValue));
            }
            break;
        case 72:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 73:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enum8", value, readAttributeEnum8DefaultValue));
            }
            break;
        case 74:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enum16", value, 0U));
                readAttributeEnum16DefaultValue = value;
            }
            break;
        case 75:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 76:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readAttributeEnum16DefaultValue));
            }
            break;
        case 77:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 78:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enum16", value, readAttributeEnum16DefaultValue));
            }
            break;
        case 79:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("epochUs", value, 0ULL));
                readAttributeEpochUSDefaultValue = value;
            }
            break;
        case 80:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 81:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readAttributeEpochUSDefaultValue));
            }
            break;
        case 82:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 83:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("epochUs", value, readAttributeEpochUSDefaultValue));
            }
            break;
        case 84:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("epochS", value, 0UL));
                readAttributeEpochSDefaultValue = value;
            }
            break;
        case 85:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 86:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readAttributeEpochSDefaultValue));
            }
            break;
        case 87:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 88:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("epochS", value, readAttributeEpochSDefaultValue));
            }
            break;
        case 89:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::VendorId value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("vendorId", value, 0U));
                readAttributeVendorIdDefaultValue = value;
            }
            break;
        case 90:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 91:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::VendorId value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readAttributeVendorIdDefaultValue));
            }
            break;
        case 92:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 93:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::VendorId value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("vendorId", value, readAttributeVendorIdDefaultValue));
            }
            break;
        case 94:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("charString", value, chip::CharSpan("", 0)));
                if (readAttributeCharStringDefaultValueBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(readAttributeCharStringDefaultValueBuffer);
                }
                readAttributeCharStringDefaultValueBuffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.size()));
                memcpy(readAttributeCharStringDefaultValueBuffer, value.data(), value.size());
                readAttributeCharStringDefaultValue = chip::CharSpan(readAttributeCharStringDefaultValueBuffer, value.size());
            }
            break;
        case 95:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("charString", value, readAttributeCharStringDefaultValue));
            }
            break;
        case 96:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 97:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("charString", value, chip::CharSpan("NotDefault", 10)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readAttributeCharStringDefaultValue));
                if (readAttributeCharStringNotDefaultValueBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(readAttributeCharStringNotDefaultValueBuffer);
                }
                readAttributeCharStringNotDefaultValueBuffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.size()));
                memcpy(readAttributeCharStringNotDefaultValueBuffer, value.data(), value.size());
                readAttributeCharStringNotDefaultValue = chip::CharSpan(readAttributeCharStringNotDefaultValueBuffer, value.size());
            }
            break;
        case 98:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("charString", value, readAttributeCharStringNotDefaultValue));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readAttributeCharStringDefaultValue));
            }
            break;
        case 99:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 100:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("charString", value, chip::CharSpan("NotDefault", 10)));
            }
            break;
        case 101:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 102:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::ByteSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("octetString", value, chip::ByteSpan(chip::Uint8::from_const_char(""), 0)));
                if (readAttributeOctetStringDefaultValueBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(readAttributeOctetStringDefaultValueBuffer);
                }
                readAttributeOctetStringDefaultValueBuffer = static_cast<uint8_t *>(chip::Platform::MemoryAlloc(value.size()));
                memcpy(readAttributeOctetStringDefaultValueBuffer, value.data(), value.size());
                readAttributeOctetStringDefaultValue = chip::ByteSpan(readAttributeOctetStringDefaultValueBuffer, value.size());
            }
            break;
        case 103:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::ByteSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("octetString", value, readAttributeOctetStringDefaultValue));
            }
            break;
        case 104:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 105:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::ByteSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(
                    CheckValueAsString("octetString", value, chip::ByteSpan(chip::Uint8::from_const_char("NotDefault"), 10)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readAttributeOctetStringDefaultValue));
                if (readAttributeOctetStringNotDefaultValueBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(readAttributeOctetStringNotDefaultValueBuffer);
                }
                readAttributeOctetStringNotDefaultValueBuffer = static_cast<uint8_t *>(chip::Platform::MemoryAlloc(value.size()));
                memcpy(readAttributeOctetStringNotDefaultValueBuffer, value.data(), value.size());
                readAttributeOctetStringNotDefaultValue =
                    chip::ByteSpan(readAttributeOctetStringNotDefaultValueBuffer, value.size());
            }
            break;
        case 106:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::ByteSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("octetString", value, readAttributeOctetStringNotDefaultValue));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readAttributeOctetStringDefaultValue));
            }
            break;
        case 107:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 108:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::ByteSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(
                    CheckValueAsString("octetString", value, chip::ByteSpan(chip::Uint8::from_const_char("NotDefault"), 10)));
            }
            break;
        case 109:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Send Test Add Arguments Command");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestAddArguments::Type value;
            value.arg1 = 3U;
            value.arg2 = 17U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Commands::TestAddArguments::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Send Test Add Arguments Command");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestAddArguments::Type value;
            value.arg1 = 3U;
            value.arg2 = 17U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Commands::TestAddArguments::Id, value,
                               chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "Send Test Add Arguments Command");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestAddArguments::Type value;
            value.arg1 = 3U;
            value.arg2 = TestAddArgumentDefaultValue;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Commands::TestAddArguments::Id, value,
                               chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Read attribute BOOLEAN Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Boolean::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Write attribute BOOLEAN Not Default Value");
            ListFreer listFreer;
            bool value;
            value = 1;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Boolean::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read attribute BOOLEAN Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Boolean::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Write attribute BOOLEAN DefaultValue");
            ListFreer listFreer;
            bool value;
            value = readAttributeBooleanDefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Boolean::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read attribute BOOLEAN False");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Boolean::Id, true,
                                 chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Read attribute BITMAP8 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap8::Id, true,
                                 chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Write attribute BITMAP8 Not Default Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap>>(1U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap8::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Read attribute BITMAP8 Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap8::Id, true,
                                 chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Write attribute BITMAP8 Default Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap> value;
            value = readAttributeBitmap8DefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap8::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Read attribute BITMAP8 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap8::Id, true,
                                 chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Read attribute BITMAP16 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap16::Id, true,
                                 chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Write attribute BITMAP16 Not Default Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap>>(1U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap16::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Read attribute BITMAP16 Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap16::Id, true,
                                 chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Write attribute BITMAP16 Default Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap> value;
            value = readAttributeBitmap16DefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap16::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Read attribute BITMAP16 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap16::Id, true,
                                 chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Read attribute BITMAP32 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap32::Id, true,
                                 chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Write attribute BITMAP32 Not Default Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap>>(1UL);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap32::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "Read attribute BITMAP32 Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap32::Id, true,
                                 chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Write attribute BITMAP32 Default Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap> value;
            value = readAttributeBitmap32DefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap32::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "Read attribute BITMAP32 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap32::Id, true,
                                 chip::NullOptional);
        }
        case 24: {
            LogStep(24, "Read attribute BITMAP64 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap64::Id, true,
                                 chip::NullOptional);
        }
        case 25: {
            LogStep(25, "Write attribute BITMAP64 Not Default Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap>>(1ULL);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap64::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 26: {
            LogStep(26, "Read attribute BITMAP64 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap64::Id, true,
                                 chip::NullOptional);
        }
        case 27: {
            LogStep(27, "Write attribute BITMAP64 Default Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap> value;
            value = readAttributeBitmap64DefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap64::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 28: {
            LogStep(28, "Read attribute BITMAP64 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap64::Id, true,
                                 chip::NullOptional);
        }
        case 29: {
            LogStep(29, "Read attribute INT8U Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int8u::Id, true,
                                 chip::NullOptional);
        }
        case 30: {
            LogStep(30, "Write attribute INT8U Not Default Value");
            ListFreer listFreer;
            uint8_t value;
            value = 1U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int8u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 31: {
            LogStep(31, "Read attribute INT8U Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int8u::Id, true,
                                 chip::NullOptional);
        }
        case 32: {
            LogStep(32, "Write attribute INT8U Default Value");
            ListFreer listFreer;
            uint8_t value;
            value = readAttributeInt8uDefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int8u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 33: {
            LogStep(33, "Read attribute INT8U Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int8u::Id, true,
                                 chip::NullOptional);
        }
        case 34: {
            LogStep(34, "Read attribute INT16U Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int16u::Id, true,
                                 chip::NullOptional);
        }
        case 35: {
            LogStep(35, "Write attribute INT16U Not Default Value");
            ListFreer listFreer;
            uint16_t value;
            value = 1U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int16u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 36: {
            LogStep(36, "Read attribute INT16U Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int16u::Id, true,
                                 chip::NullOptional);
        }
        case 37: {
            LogStep(37, "Write attribute INT16U Default Value");
            ListFreer listFreer;
            uint16_t value;
            value = readAttributeInt16uDefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int16u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 38: {
            LogStep(38, "Read attribute INT16U Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int16u::Id, true,
                                 chip::NullOptional);
        }
        case 39: {
            LogStep(39, "Read attribute INT32U Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32u::Id, true,
                                 chip::NullOptional);
        }
        case 40: {
            LogStep(40, "Write attribute INT32U Not Default Value");
            ListFreer listFreer;
            uint32_t value;
            value = 1UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 41: {
            LogStep(41, "Read attribute INT32U Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32u::Id, true,
                                 chip::NullOptional);
        }
        case 42: {
            LogStep(42, "Write attribute INT32U Default Value");
            ListFreer listFreer;
            uint32_t value;
            value = readAttributeInt32uDefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 43: {
            LogStep(43, "Read attribute INT32U Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32u::Id, true,
                                 chip::NullOptional);
        }
        case 44: {
            LogStep(44, "Read attribute INT64U Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int64u::Id, true,
                                 chip::NullOptional);
        }
        case 45: {
            LogStep(45, "Write attribute INT64U Not Default Value");
            ListFreer listFreer;
            uint64_t value;
            value = 1ULL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int64u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 46: {
            LogStep(46, "Read attribute INT64U Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int64u::Id, true,
                                 chip::NullOptional);
        }
        case 47: {
            LogStep(47, "Write attribute INT64U Default Value");
            ListFreer listFreer;
            uint64_t value;
            value = readAttributeInt64uDefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int64u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 48: {
            LogStep(48, "Read attribute INT64U Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int64u::Id, true,
                                 chip::NullOptional);
        }
        case 49: {
            LogStep(49, "Read attribute INT8S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int8s::Id, true,
                                 chip::NullOptional);
        }
        case 50: {
            LogStep(50, "Write attribute INT8S Not Default Value");
            ListFreer listFreer;
            int8_t value;
            value = 1;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int8s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 51: {
            LogStep(51, "Read attribute INT8S Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int8s::Id, true,
                                 chip::NullOptional);
        }
        case 52: {
            LogStep(52, "Write attribute INT8S Default Value");
            ListFreer listFreer;
            int8_t value;
            value = readAttributeInt8sDefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int8s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 53: {
            LogStep(53, "Read attribute INT8S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int8s::Id, true,
                                 chip::NullOptional);
        }
        case 54: {
            LogStep(54, "Read attribute INT16S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int16s::Id, true,
                                 chip::NullOptional);
        }
        case 55: {
            LogStep(55, "Write attribute INT16S Not Default Value");
            ListFreer listFreer;
            int16_t value;
            value = 1;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int16s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 56: {
            LogStep(56, "Read attribute INT16S Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int16s::Id, true,
                                 chip::NullOptional);
        }
        case 57: {
            LogStep(57, "Write attribute INT16S Default Value");
            ListFreer listFreer;
            int16_t value;
            value = readAttributeInt16sDefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int16s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 58: {
            LogStep(58, "Read attribute INT16S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int16s::Id, true,
                                 chip::NullOptional);
        }
        case 59: {
            LogStep(59, "Read attribute INT32S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32s::Id, true,
                                 chip::NullOptional);
        }
        case 60: {
            LogStep(60, "Write attribute INT32S Not Default Value");
            ListFreer listFreer;
            int32_t value;
            value = 1L;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 61: {
            LogStep(61, "Read attribute INT32S Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32s::Id, true,
                                 chip::NullOptional);
        }
        case 62: {
            LogStep(62, "Write attribute INT32S Default Value");
            ListFreer listFreer;
            int32_t value;
            value = readAttributeInt32sDefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 63: {
            LogStep(63, "Read attribute INT32S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32s::Id, true,
                                 chip::NullOptional);
        }
        case 64: {
            LogStep(64, "Read attribute INT64S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int64s::Id, true,
                                 chip::NullOptional);
        }
        case 65: {
            LogStep(65, "Write attribute INTS Not Default Value");
            ListFreer listFreer;
            int64_t value;
            value = 1LL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int64s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 66: {
            LogStep(66, "Read attribute INT64S Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int64s::Id, true,
                                 chip::NullOptional);
        }
        case 67: {
            LogStep(67, "Write attribute INT64S Default Value");
            ListFreer listFreer;
            int64_t value;
            value = readAttributeInt64sDefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int64s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 68: {
            LogStep(68, "Read attribute INT64S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int64s::Id, true,
                                 chip::NullOptional);
        }
        case 69: {
            LogStep(69, "Read attribute ENUM8 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Enum8::Id, true,
                                 chip::NullOptional);
        }
        case 70: {
            LogStep(70, "Write attribute ENUM8 Not Default Value");
            ListFreer listFreer;
            uint8_t value;
            value = 1U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Enum8::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 71: {
            LogStep(71, "Read attribute ENUM8 Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Enum8::Id, true,
                                 chip::NullOptional);
        }
        case 72: {
            LogStep(72, "Write attribute ENUM8 Default Value");
            ListFreer listFreer;
            uint8_t value;
            value = readAttributeEnum8DefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Enum8::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 73: {
            LogStep(73, "Read attribute ENUM8 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Enum8::Id, true,
                                 chip::NullOptional);
        }
        case 74: {
            LogStep(74, "Read attribute ENUM16 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Enum16::Id, true,
                                 chip::NullOptional);
        }
        case 75: {
            LogStep(75, "Write attribute ENUM16 Not Default Value");
            ListFreer listFreer;
            uint16_t value;
            value = 1U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Enum16::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 76: {
            LogStep(76, "Read attribute ENUM16 Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Enum16::Id, true,
                                 chip::NullOptional);
        }
        case 77: {
            LogStep(77, "Write attribute ENUM16 Default Value");
            ListFreer listFreer;
            uint16_t value;
            value = readAttributeEnum16DefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Enum16::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 78: {
            LogStep(78, "Read attribute ENUM16 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Enum16::Id, true,
                                 chip::NullOptional);
        }
        case 79: {
            LogStep(79, "Read attribute EPOCH_US Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::EpochUs::Id, true,
                                 chip::NullOptional);
        }
        case 80: {
            LogStep(80, "Write attribute EPOCH_US Not Default Value");
            ListFreer listFreer;
            uint64_t value;
            value = 1ULL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::EpochUs::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 81: {
            LogStep(81, "Read attribute EPOCH_US Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::EpochUs::Id, true,
                                 chip::NullOptional);
        }
        case 82: {
            LogStep(82, "Write attribute EPOCH_US Default Value");
            ListFreer listFreer;
            uint64_t value;
            value = readAttributeEpochUSDefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::EpochUs::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 83: {
            LogStep(83, "Read attribute EPOCH_US Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::EpochUs::Id, true,
                                 chip::NullOptional);
        }
        case 84: {
            LogStep(84, "Read attribute EPOCH_S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::EpochS::Id, true,
                                 chip::NullOptional);
        }
        case 85: {
            LogStep(85, "Write attribute EPOCH_S Not Default Value");
            ListFreer listFreer;
            uint32_t value;
            value = 1UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::EpochS::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 86: {
            LogStep(86, "Read attribute EPOCH_S Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::EpochS::Id, true,
                                 chip::NullOptional);
        }
        case 87: {
            LogStep(87, "Write attribute EPOCH_S Default Value");
            ListFreer listFreer;
            uint32_t value;
            value = readAttributeEpochSDefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::EpochS::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 88: {
            LogStep(88, "Read attribute EPOCH_S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::EpochS::Id, true,
                                 chip::NullOptional);
        }
        case 89: {
            LogStep(89, "Read attribute vendor_id Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::VendorId::Id, true,
                                 chip::NullOptional);
        }
        case 90: {
            LogStep(90, "Write attribute vendor_id Not Default Value");
            ListFreer listFreer;
            chip::VendorId value;
            value = static_cast<chip::VendorId>(1);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::VendorId::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 91: {
            LogStep(91, "Read attribute vendor_id Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::VendorId::Id, true,
                                 chip::NullOptional);
        }
        case 92: {
            LogStep(92, "Write attribute vendor_id Default Value");
            ListFreer listFreer;
            chip::VendorId value;
            value = readAttributeVendorIdDefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::VendorId::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 93: {
            LogStep(93, "Read attribute vendor_id Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::VendorId::Id, true,
                                 chip::NullOptional);
        }
        case 94: {
            LogStep(94, "Read attribute char_string Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, true,
                                 chip::NullOptional);
        }
        case 95: {
            LogStep(95, "Read attribute char_string Default Value and compare to saved value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, true,
                                 chip::NullOptional);
        }
        case 96: {
            LogStep(96, "Write attribute char_string Not Default Value");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("NotDefaultgarbage: not in length on purpose", 10);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 97: {
            LogStep(97, "Read attribute char_string Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, true,
                                 chip::NullOptional);
        }
        case 98: {
            LogStep(98, "Read attribute char_string Not Default Value and compare to saved value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, true,
                                 chip::NullOptional);
        }
        case 99: {
            LogStep(99, "Write attribute char_string Not Default Value from saved value");
            ListFreer listFreer;
            chip::CharSpan value;
            value = readAttributeCharStringNotDefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 100: {
            LogStep(100, "Read attribute char_string Not Default Value and compare to expected value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, true,
                                 chip::NullOptional);
        }
        case 101: {
            LogStep(101, "Write attribute char_string Default Value");
            ListFreer listFreer;
            chip::CharSpan value;
            value = readAttributeCharStringDefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 102: {
            LogStep(102, "Read attribute octet_string Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::OctetString::Id, true,
                                 chip::NullOptional);
        }
        case 103: {
            LogStep(103, "Read attribute octet_string Default Value and compare to saved value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::OctetString::Id, true,
                                 chip::NullOptional);
        }
        case 104: {
            LogStep(104, "Write attribute octet_string Not Default Value");
            ListFreer listFreer;
            chip::ByteSpan value;
            value = chip::ByteSpan(chip::Uint8::from_const_char("NotDefaultgarbage: not in length on purpose"), 10);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::OctetString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 105: {
            LogStep(105, "Read attribute octet_string Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::OctetString::Id, true,
                                 chip::NullOptional);
        }
        case 106: {
            LogStep(106, "Read attribute octet_string Not Default Value and compare to saved value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::OctetString::Id, true,
                                 chip::NullOptional);
        }
        case 107: {
            LogStep(107, "Write attribute octet_string Not Default Value from saved value");
            ListFreer listFreer;
            chip::ByteSpan value;
            value = readAttributeOctetStringNotDefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::OctetString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 108: {
            LogStep(108, "Read attribute octet_string Not Default Value and compare to expected value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::OctetString::Id, true,
                                 chip::NullOptional);
        }
        case 109: {
            LogStep(109, "Write attribute octet_string Default Value");
            ListFreer listFreer;
            chip::ByteSpan value;
            value = readAttributeOctetStringDefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::OctetString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestConfigVariablesSuite : public TestCommand
{
public:
    TestConfigVariablesSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestConfigVariables", 3, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("arg1", 0, UINT8_MAX, &mArg1);
        AddArgument("returnValueWithArg1", 0, UINT8_MAX, &mReturnValueWithArg1);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestConfigVariablesSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint8_t> mArg1;
    chip::Optional<uint8_t> mReturnValueWithArg1;
    chip::Optional<uint16_t> mTimeout;

    uint8_t TestAddArgumentDefaultValue;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::TestAddArgumentsResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("returnValue", value.returnValue, 20U));
                TestAddArgumentDefaultValue = value.returnValue;
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::TestAddArgumentsResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("returnValue", value.returnValue,
                                          mReturnValueWithArg1.HasValue() ? mReturnValueWithArg1.Value() : 25U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Send Test Add Arguments Command");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestAddArguments::Type value;
            value.arg1 = 3U;
            value.arg2 = 17U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Commands::TestAddArguments::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Send Test Add Arguments Command");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestAddArguments::Type value;
            value.arg1 = mArg1.HasValue() ? mArg1.Value() : 5U;
            value.arg2 = TestAddArgumentDefaultValue;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Commands::TestAddArguments::Id, value,
                               chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestDescriptorClusterSuite : public TestCommand
{
public:
    TestDescriptorClusterSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestDescriptorCluster", 5, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestDescriptorClusterSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::Descriptor::Structs::DeviceTypeStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("deviceTypeList", iter_0, 0));
                    VerifyOrReturn(CheckValue("deviceTypeList[0].type", iter_0.GetValue().type, 22UL));
                    VerifyOrReturn(CheckValue("deviceTypeList[0].revision", iter_0.GetValue().revision, 1U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("deviceTypeList", iter_0, 1));
                }
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::ClusterId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 0));
                    VerifyOrReturn(CheckValue("serverList[0]", iter_0.GetValue(), 3UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 1));
                    VerifyOrReturn(CheckValue("serverList[1]", iter_0.GetValue(), 4UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 2));
                    VerifyOrReturn(CheckValue("serverList[2]", iter_0.GetValue(), 29UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 3));
                    VerifyOrReturn(CheckValue("serverList[3]", iter_0.GetValue(), 30UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 4));
                    VerifyOrReturn(CheckValue("serverList[4]", iter_0.GetValue(), 31UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 5));
                    VerifyOrReturn(CheckValue("serverList[5]", iter_0.GetValue(), 40UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 6));
                    VerifyOrReturn(CheckValue("serverList[6]", iter_0.GetValue(), 42UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 7));
                    VerifyOrReturn(CheckValue("serverList[7]", iter_0.GetValue(), 43UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 8));
                    VerifyOrReturn(CheckValue("serverList[8]", iter_0.GetValue(), 44UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 9));
                    VerifyOrReturn(CheckValue("serverList[9]", iter_0.GetValue(), 45UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 10));
                    VerifyOrReturn(CheckValue("serverList[10]", iter_0.GetValue(), 46UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 11));
                    VerifyOrReturn(CheckValue("serverList[11]", iter_0.GetValue(), 47UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 12));
                    VerifyOrReturn(CheckValue("serverList[12]", iter_0.GetValue(), 48UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 13));
                    VerifyOrReturn(CheckValue("serverList[13]", iter_0.GetValue(), 49UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 14));
                    VerifyOrReturn(CheckValue("serverList[14]", iter_0.GetValue(), 50UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 15));
                    VerifyOrReturn(CheckValue("serverList[15]", iter_0.GetValue(), 51UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 16));
                    VerifyOrReturn(CheckValue("serverList[16]", iter_0.GetValue(), 52UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 17));
                    VerifyOrReturn(CheckValue("serverList[17]", iter_0.GetValue(), 53UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 18));
                    VerifyOrReturn(CheckValue("serverList[18]", iter_0.GetValue(), 54UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 19));
                    VerifyOrReturn(CheckValue("serverList[19]", iter_0.GetValue(), 55UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 20));
                    VerifyOrReturn(CheckValue("serverList[20]", iter_0.GetValue(), 60UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 21));
                    VerifyOrReturn(CheckValue("serverList[21]", iter_0.GetValue(), 62UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 22));
                    VerifyOrReturn(CheckValue("serverList[22]", iter_0.GetValue(), 63UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 23));
                    VerifyOrReturn(CheckValue("serverList[23]", iter_0.GetValue(), 64UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 24));
                    VerifyOrReturn(CheckValue("serverList[24]", iter_0.GetValue(), 65UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 25));
                    VerifyOrReturn(CheckValue("serverList[25]", iter_0.GetValue(), 1029UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 26));
                    VerifyOrReturn(CheckValue("serverList[26]", iter_0.GetValue(), 4294048774UL));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("serverList", iter_0, 27));
                }
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::ClusterId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("clientList", iter_0, 0));
                    VerifyOrReturn(CheckValue("clientList[0]", iter_0.GetValue(), 41UL));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("clientList", iter_0, 1));
                }
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::EndpointId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("partsList", iter_0, 0));
                    VerifyOrReturn(CheckValue("partsList[0]", iter_0.GetValue(), 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("partsList", iter_0, 1));
                    VerifyOrReturn(CheckValue("partsList[1]", iter_0.GetValue(), 2U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("partsList", iter_0, 2));
                }
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read attribute Device list");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Descriptor::Id, Descriptor::Attributes::DeviceTypeList::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read attribute Server list");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Descriptor::Id, Descriptor::Attributes::ServerList::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read attribute Client list");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Descriptor::Id, Descriptor::Attributes::ClientList::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read attribute Parts list");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Descriptor::Id, Descriptor::Attributes::PartsList::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestBasicInformationSuite : public TestCommand
{
public:
    TestBasicInformationSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestBasicInformation", 18, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestBasicInformationSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("location", value, chip::CharSpan("XX", 2)));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("location", value, chip::CharSpan("US", 2)));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 0));
                    VerifyOrReturn(CheckValue("attributeList[0]", iter_0.GetValue(), 0UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 1));
                    VerifyOrReturn(CheckValue("attributeList[1]", iter_0.GetValue(), 1UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 2));
                    VerifyOrReturn(CheckValue("attributeList[2]", iter_0.GetValue(), 2UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 3));
                    VerifyOrReturn(CheckValue("attributeList[3]", iter_0.GetValue(), 3UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 4));
                    VerifyOrReturn(CheckValue("attributeList[4]", iter_0.GetValue(), 4UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 5));
                    VerifyOrReturn(CheckValue("attributeList[5]", iter_0.GetValue(), 5UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 6));
                    VerifyOrReturn(CheckValue("attributeList[6]", iter_0.GetValue(), 6UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 7));
                    VerifyOrReturn(CheckValue("attributeList[7]", iter_0.GetValue(), 7UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 8));
                    VerifyOrReturn(CheckValue("attributeList[8]", iter_0.GetValue(), 8UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 9));
                    VerifyOrReturn(CheckValue("attributeList[9]", iter_0.GetValue(), 9UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 10));
                    VerifyOrReturn(CheckValue("attributeList[10]", iter_0.GetValue(), 10UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 11));
                    VerifyOrReturn(CheckValue("attributeList[11]", iter_0.GetValue(), 11UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 12));
                    VerifyOrReturn(CheckValue("attributeList[12]", iter_0.GetValue(), 12UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 13));
                    VerifyOrReturn(CheckValue("attributeList[13]", iter_0.GetValue(), 13UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 14));
                    VerifyOrReturn(CheckValue("attributeList[14]", iter_0.GetValue(), 14UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 15));
                    VerifyOrReturn(CheckValue("attributeList[15]", iter_0.GetValue(), 15UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 16));
                    VerifyOrReturn(CheckValue("attributeList[16]", iter_0.GetValue(), 16UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 17));
                    VerifyOrReturn(CheckValue("attributeList[17]", iter_0.GetValue(), 17UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 18));
                    VerifyOrReturn(CheckValue("attributeList[18]", iter_0.GetValue(), 18UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 19));
                    VerifyOrReturn(CheckValue("attributeList[19]", iter_0.GetValue(), 19UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 20));
                    VerifyOrReturn(CheckValue("attributeList[20]", iter_0.GetValue(), 65528UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 21));
                    VerifyOrReturn(CheckValue("attributeList[21]", iter_0.GetValue(), 65529UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 22));
                    VerifyOrReturn(CheckValue("attributeList[22]", iter_0.GetValue(), 65531UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 23));
                    VerifyOrReturn(CheckValue("attributeList[23]", iter_0.GetValue(), 65532UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 24));
                    VerifyOrReturn(CheckValue("attributeList[24]", iter_0.GetValue(), 65533UL));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("attributeList", iter_0, 25));
                }
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("nodeLabel", value, chip::CharSpan("", 0)));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("nodeLabel", value, chip::CharSpan("My node", 7)));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("localConfigDisabled", value, false));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("localConfigDisabled", value, true));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("nodeLabel", value, chip::CharSpan("My node", 7)));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("localConfigDisabled", value, true));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read location");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::Location::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Write location");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("USgarbage: not in length on purpose", 2);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::Location::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read back location");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::Location::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Restore initial location value");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("XXgarbage: not in length on purpose", 2);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::Location::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read AttributeList value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read NodeLabel");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::NodeLabel::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Write NodeLabel");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("My nodegarbage: not in length on purpose", 7);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::NodeLabel::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read back NodeLabel");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::NodeLabel::Id, true,
                                 chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Read LocalConfigDisabled");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::LocalConfigDisabled::Id, true,
                                 chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Write LocalConfigDisabled");
            ListFreer listFreer;
            bool value;
            value = true;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::LocalConfigDisabled::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Read back LocalConfigDisabled");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::LocalConfigDisabled::Id, true,
                                 chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Reboot the device");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
            return Reboot(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "Connect to the device again");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14, "Read back NodeLabel after reboot");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::NodeLabel::Id, true,
                                 chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Restore initial NodeLabel value");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("garbage: not in length on purpose", 0);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::NodeLabel::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Read back LocalConfigDisabled after reboot");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::LocalConfigDisabled::Id, true,
                                 chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Restore initial LocalConfigDisabled value");
            ListFreer listFreer;
            bool value;
            value = false;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::LocalConfigDisabled::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestFabricRemovalWhileSubscribedSuite : public TestCommand
{
public:
    TestFabricRemovalWhileSubscribedSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestFabricRemovalWhileSubscribed", 8, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("discriminator", 0, UINT16_MAX, &mDiscriminator);
        AddArgument("payload", &mPayload);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestFabricRemovalWhileSubscribedSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mDiscriminator;
    chip::Optional<chip::CharSpan> mPayload;
    chip::Optional<uint16_t> mTimeout;

    uint8_t ourFabricIndex;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("commissionedFabrics", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                ourFabricIndex = value;
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::OperationalCredentials::Structs::FabricDescriptor::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::OperationalCredentials::Commands::NOCResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read number of commissioned fabrics");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::CommissionedFabrics::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read current fabric index");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::CurrentFabricIndex::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Open commissioning window from alpha");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Commission from beta");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = 74565ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 5: {
            LogStep(5, "Wait for the commissioned device to be retrieved for beta");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = 74565ULL;
            return WaitForCommissionee(kIdentityBeta, value);
        }
        case 6: {
            LogStep(6, "Subscribe Fabrics Attribute from beta");
            return SubscribeAttribute(kIdentityBeta, GetEndpoint(0), OperationalCredentials::Id,
                                      OperationalCredentials::Attributes::Fabrics::Id, 2, 5, true, chip::NullOptional,
                                      chip::NullOptional, /* autoResubscribe = */ chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Remove single own fabric");
            ListFreer listFreer;
            chip::app::Clusters::OperationalCredentials::Commands::RemoveFabric::Type value;
            value.fabricIndex = ourFabricIndex;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                               OperationalCredentials::Commands::RemoveFabric::Id, value, chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestGeneralCommissioningSuite : public TestCommand
{
public:
    TestGeneralCommissioningSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestGeneralCommissioning", 31, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("discriminator", 0, UINT16_MAX, &mDiscriminator);
        AddArgument("payload", &mPayload);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestGeneralCommissioningSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mDiscriminator;
    chip::Optional<chip::CharSpan> mPayload;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("breadcrumb", value, 137438953472ULL));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("breadcrumb", value, 81ULL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("breadcrumb", value, 0ULL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("breadcrumb", value, 1ULL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::GeneralCommissioning::Commands::CommissioningCompleteResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("errorCode", value.errorCode, 3U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("breadcrumb", value, 1ULL));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::GeneralCommissioning::Commands::ArmFailSafeResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("errorCode", value.errorCode, 4U));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("breadcrumb", value, 1ULL));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::GeneralCommissioning::Commands::ArmFailSafeResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("errorCode", value.errorCode, 0U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("breadcrumb", value, 2ULL));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::GeneralCommissioning::Commands::ArmFailSafeResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("errorCode", value.errorCode, 4U));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("breadcrumb", value, 2ULL));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::GeneralCommissioning::Commands::CommissioningCompleteResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("errorCode", value.errorCode, 2U));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("breadcrumb", value, 2ULL));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::GeneralCommissioning::Commands::CommissioningCompleteResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("errorCode", value.errorCode, 0U));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("breadcrumb", value, 0ULL));
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::GeneralCommissioning::Commands::ArmFailSafeResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("errorCode", value.errorCode, 0U));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("breadcrumb", value, 3ULL));
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::GeneralCommissioning::Commands::ArmFailSafeResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("errorCode", value.errorCode, 0U));
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("breadcrumb", value, 0ULL));
            }
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "boolean", "boolean"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Write Breadcrumb (1/2)");
            ListFreer listFreer;
            uint64_t value;
            value = 137438953472ULL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                  GeneralCommissioning::Attributes::Breadcrumb::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read back Breadcrumb (1/2)");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::Breadcrumb::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Write Breadcrumb (2/2)");
            ListFreer listFreer;
            uint64_t value;
            value = 81ULL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                  GeneralCommissioning::Attributes::Breadcrumb::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read back Breadcrumb (2/2)");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::Breadcrumb::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Reboot to reset Breadcrumb");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
            return Reboot(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6, "Connect to the device again");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "Read back Breadcrumb after reboot and ensure it was not persisted");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::Breadcrumb::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Set Breadcrumb to nonzero value");
            ListFreer listFreer;
            uint64_t value;
            value = 1ULL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                  GeneralCommissioning::Attributes::Breadcrumb::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Check Breadcrumb set worked");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::Breadcrumb::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Send CommissioningComplete without armed fail-safe");
            ListFreer listFreer;
            chip::app::Clusters::GeneralCommissioning::Commands::CommissioningComplete::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                               GeneralCommissioning::Commands::CommissioningComplete::Id, value, chip::NullOptional

            );
        }
        case 11: {
            LogStep(11, "Check Breadcrumb was not touched by invalid CommissioningComplete");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::Breadcrumb::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Open Commissioning Window from alpha");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 13: {
            LogStep(13, "Try to arm fail-safe");
            ListFreer listFreer;
            chip::app::Clusters::GeneralCommissioning::Commands::ArmFailSafe::Type value;
            value.expiryLengthSeconds = 10U;
            value.breadcrumb          = 5000ULL;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                               GeneralCommissioning::Commands::ArmFailSafe::Id, value, chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "Check Breadcrumb was not touched by ArmFailSafe with commissioning window open");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::Breadcrumb::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Reset Breadcrumb to 0 so we can commission");
            ListFreer listFreer;
            uint64_t value;
            value = 0ULL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                  GeneralCommissioning::Attributes::Breadcrumb::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Commission from beta");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = 74565ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 17: {
            LogStep(17, "Wait for the commissioned device to be retrieved for beta");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = 74565ULL;
            return WaitForCommissionee(kIdentityBeta, value);
        }
        case 18: {
            LogStep(18, "Arm fail-safe");
            ListFreer listFreer;
            chip::app::Clusters::GeneralCommissioning::Commands::ArmFailSafe::Type value;
            value.expiryLengthSeconds = 500U;
            value.breadcrumb          = 2ULL;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                               GeneralCommissioning::Commands::ArmFailSafe::Id, value, chip::NullOptional

            );
        }
        case 19: {
            LogStep(19, "Check Breadcrumb was properly set by ArmFailSafe");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::Breadcrumb::Id, true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Try to arm fail-safe from wrong fabric");
            ListFreer listFreer;
            chip::app::Clusters::GeneralCommissioning::Commands::ArmFailSafe::Type value;
            value.expiryLengthSeconds = 10U;
            value.breadcrumb          = 5000ULL;
            return SendCommand(kIdentityBeta, GetEndpoint(0), GeneralCommissioning::Id,
                               GeneralCommissioning::Commands::ArmFailSafe::Id, value, chip::NullOptional

            );
        }
        case 21: {
            LogStep(21, "Check Breadcrumb was not touched by ArmFailSafe with existing fail-safe armed");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::Breadcrumb::Id, true, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Send CommissioningComplete from wrong fabric");
            ListFreer listFreer;
            chip::app::Clusters::GeneralCommissioning::Commands::CommissioningComplete::Type value;
            return SendCommand(kIdentityBeta, GetEndpoint(0), GeneralCommissioning::Id,
                               GeneralCommissioning::Commands::CommissioningComplete::Id, value, chip::NullOptional

            );
        }
        case 23: {
            LogStep(23, "Check Breadcrumb was not touched by CommissioningComplete from wrong fabric");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::Breadcrumb::Id, true, chip::NullOptional);
        }
        case 24: {
            LogStep(24, "Close out the fail-safe gracefully");
            ListFreer listFreer;
            chip::app::Clusters::GeneralCommissioning::Commands::CommissioningComplete::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                               GeneralCommissioning::Commands::CommissioningComplete::Id, value, chip::NullOptional

            );
        }
        case 25: {
            LogStep(25, "Check Breadcrumb was reset to 0 by CommissioningComplete");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::Breadcrumb::Id, true, chip::NullOptional);
        }
        case 26: {
            LogStep(26, "Arm fail-safe again");
            ListFreer listFreer;
            chip::app::Clusters::GeneralCommissioning::Commands::ArmFailSafe::Type value;
            value.expiryLengthSeconds = 500U;
            value.breadcrumb          = 3ULL;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                               GeneralCommissioning::Commands::ArmFailSafe::Id, value, chip::NullOptional

            );
        }
        case 27: {
            LogStep(27, "Check Breadcrumb was set by arming fail-safe again");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::Breadcrumb::Id, true, chip::NullOptional);
        }
        case 28: {
            LogStep(28, "Force-expire the fail-safe");
            ListFreer listFreer;
            chip::app::Clusters::GeneralCommissioning::Commands::ArmFailSafe::Type value;
            value.expiryLengthSeconds = 0U;
            value.breadcrumb          = 4ULL;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                               GeneralCommissioning::Commands::ArmFailSafe::Id, value, chip::NullOptional

            );
        }
        case 29: {
            LogStep(29, "Check Breadcrumb was reset by expiring the fail-safe");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::Breadcrumb::Id, true, chip::NullOptional);
        }
        case 30: {
            LogStep(30, "Validate presence of SupportsConcurrentConnection");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::SupportsConcurrentConnection::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestIdentifyClusterSuite : public TestCommand
{
public:
    TestIdentifyClusterSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestIdentifyCluster", 2, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestIdentifyClusterSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Send Identify command and expect success response");
            ListFreer listFreer;
            chip::app::Clusters::Identify::Commands::Identify::Type value;
            value.identifyTime = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), Identify::Id, Identify::Commands::Identify::Id, value,
                               chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestOperationalCredentialsClusterSuite : public TestCommand
{
public:
    TestOperationalCredentialsClusterSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestOperationalCredentialsCluster", 8, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestOperationalCredentialsClusterSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    uint8_t ourFabricIndex;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 4U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                ourFabricIndex = value;
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::OperationalCredentials::Commands::NOCResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("statusCode", value.statusCode, 11U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::OperationalCredentials::Structs::FabricDescriptor::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 0));
                    VerifyOrReturn(CheckValueAsString("fabrics[0].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckValue("fabrics[0].fabricIndex", iter_0.GetValue().fabricIndex, ourFabricIndex));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("fabrics", iter_0, 1));
                }
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::OperationalCredentials::Commands::NOCResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("statusCode", value.statusCode, 0U));
                VerifyOrReturn(CheckValuePresent("fabricIndex", value.fabricIndex));
                VerifyOrReturn(CheckValue("fabricIndex.Value()", value.fabricIndex.Value(), ourFabricIndex));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::OperationalCredentials::Structs::FabricDescriptor::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 0));
                    VerifyOrReturn(CheckValueAsString("fabrics[0].label", iter_0.GetValue().label, chip::CharSpan("Batcave", 7)));
                    VerifyOrReturn(CheckValue("fabrics[0].fabricIndex", iter_0.GetValue().fabricIndex, ourFabricIndex));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("fabrics", iter_0, 1));
                }
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read number of supported fabrics");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::SupportedFabrics::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read number of commissioned fabrics");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::CommissionedFabrics::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read current fabric index");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::CurrentFabricIndex::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Remove nonexistent fabric");
            ListFreer listFreer;
            chip::app::Clusters::OperationalCredentials::Commands::RemoveFabric::Type value;
            value.fabricIndex = 243U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                               OperationalCredentials::Commands::RemoveFabric::Id, value, chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "Read fabric list before setting label");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::Fabrics::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Set the fabric label");
            ListFreer listFreer;
            chip::app::Clusters::OperationalCredentials::Commands::UpdateFabricLabel::Type value;
            value.label = chip::Span<const char>("Batcavegarbage: not in length on purpose", 7);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                               OperationalCredentials::Commands::UpdateFabricLabel::Id, value, chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "Read fabric list after setting label");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::Fabrics::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestModeSelectClusterSuite : public TestCommand
{
public:
    TestModeSelectClusterSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestModeSelectCluster", 32, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestModeSelectClusterSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    uint8_t currentModeBeforeToggle;
    chip::app::DataModel::Nullable<uint8_t> OnModeValue;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("description", value, chip::CharSpan("Coffee", 6)));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("standardNamespace", value));
                VerifyOrReturn(CheckValue("standardNamespace.Value()", value.Value(), 0U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::ModeSelect::Structs::ModeOptionStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("supportedModes", iter_0, 0));
                    VerifyOrReturn(
                        CheckValueAsString("supportedModes[0].label", iter_0.GetValue().label, chip::CharSpan("Black", 5)));
                    VerifyOrReturn(CheckValue("supportedModes[0].mode", iter_0.GetValue().mode, 0U));
                    {
                        auto iter_2 = iter_0.GetValue().semanticTags.begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().semanticTags)>(
                            "supportedModes[0].semanticTags", iter_2, 0));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().semanticTags)>(
                            "supportedModes[0].semanticTags", iter_2, 1));
                    }
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("supportedModes", iter_0, 1));
                    VerifyOrReturn(
                        CheckValueAsString("supportedModes[1].label", iter_0.GetValue().label, chip::CharSpan("Cappuccino", 10)));
                    VerifyOrReturn(CheckValue("supportedModes[1].mode", iter_0.GetValue().mode, 4U));
                    {
                        auto iter_2 = iter_0.GetValue().semanticTags.begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().semanticTags)>(
                            "supportedModes[1].semanticTags", iter_2, 0));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().semanticTags)>(
                            "supportedModes[1].semanticTags", iter_2, 1));
                    }
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("supportedModes", iter_0, 2));
                    VerifyOrReturn(
                        CheckValueAsString("supportedModes[2].label", iter_0.GetValue().label, chip::CharSpan("Espresso", 8)));
                    VerifyOrReturn(CheckValue("supportedModes[2].mode", iter_0.GetValue().mode, 7U));
                    {
                        auto iter_2 = iter_0.GetValue().semanticTags.begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().semanticTags)>(
                            "supportedModes[2].semanticTags", iter_2, 0));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().semanticTags)>(
                            "supportedModes[2].semanticTags", iter_2, 1));
                    }
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("supportedModes", iter_0, 3));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintMinLength("value", value, 3));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 3));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentMode", value, 0U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("startUpMode", value));
                VerifyOrReturn(CheckValue("startUpMode.Value()", value.Value(), 0U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("onMode", value));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentMode", value, 4U));
                currentModeBeforeToggle = value;
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentMode", value, currentModeBeforeToggle));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("onMode", value));
                VerifyOrReturn(CheckValue("onMode.Value()", value.Value(), 7U));
                OnModeValue = value;
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentMode", value, OnModeValue));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("startUpMode", value));
                VerifyOrReturn(CheckValue("startUpMode.Value()", value.Value(), 7U));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentMode", value, 4U));
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentMode", value, 7U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read Description");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::Description::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read StandardNamespace");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::StandardNamespace::Id,
                                 true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read SupportedModes");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::SupportedModes::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read CurrentMode");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::CurrentMode::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read StartUpMode");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::StartUpMode::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read OnMode");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::OnMode::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Change to Supported Mode");
            ListFreer listFreer;
            chip::app::Clusters::ModeSelect::Commands::ChangeToMode::Type value;
            value.newMode = 4U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Commands::ChangeToMode::Id, value,
                               chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "Verify Current Mode Change");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::CurrentMode::Id, true,
                                 chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Change to Unsupported Mode");
            ListFreer listFreer;
            chip::app::Clusters::ModeSelect::Commands::ChangeToMode::Type value;
            value.newMode = 2U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Commands::ChangeToMode::Id, value,
                               chip::NullOptional

            );
        }
        case 10: {
            LogStep(10, "Toggle OnOff");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 11: {
            LogStep(11, "Toggle OnOff");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "Verify Current Mode does not change when OnMode is null");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::CurrentMode::Id, true,
                                 chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Change to Unsupported OnMode");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 2U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::OnMode::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Change OnMode");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 7U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::OnMode::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Verify OnMode");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::OnMode::Id, true,
                                 chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Toggle OnOff");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 17: {
            LogStep(17, "Toggle OnOff");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 18: {
            LogStep(18, "Verify Current Mode Changes if OnMode is not null");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::CurrentMode::Id, true,
                                 chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Change to Unsupported StartUp Mode");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 2U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::StartUpMode::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Change to Supported StartUp Mode");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 7U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::StartUpMode::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "Verify StartUp Mode Change");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::StartUpMode::Id, true,
                                 chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Change CurrentMode to another value");
            ListFreer listFreer;
            chip::app::Clusters::ModeSelect::Commands::ChangeToMode::Type value;
            value.newMode = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Commands::ChangeToMode::Id, value,
                               chip::NullOptional

            );
        }
        case 23: {
            LogStep(23, "Change On Mode");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 4U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::OnMode::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 24: {
            LogStep(24, "Set StartUpOnOff");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::app::Clusters::OnOff::OnOffStartUpOnOff> value;
            value.SetNonNull();
            value.Value() = static_cast<chip::app::Clusters::OnOff::OnOffStartUpOnOff>(1);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::StartUpOnOff::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 25: {
            LogStep(25, "Reboot target device");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
            return Reboot(kIdentityAlpha, value);
        }
        case 26: {
            LogStep(26, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 27: {
            LogStep(27, "Verify Current Mode Change based on OnMode, as it overwrites StartUpMode");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::CurrentMode::Id, true,
                                 chip::NullOptional);
        }
        case 28: {
            LogStep(28, "Change On Mode to Null");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::OnMode::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 29: {
            LogStep(29, "Reboot target device");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
            return Reboot(kIdentityAlpha, value);
        }
        case 30: {
            LogStep(30, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 31: {
            LogStep(31, "Verify Current Mode Change based on new StartUp Mode");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::CurrentMode::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestSelfFabricRemovalSuite : public TestCommand
{
public:
    TestSelfFabricRemovalSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestSelfFabricRemoval", 4, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestSelfFabricRemovalSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    uint8_t ourFabricIndex;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("commissionedFabrics", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                ourFabricIndex = value;
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::OperationalCredentials::Commands::NOCResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read number of commissioned fabrics");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::CommissionedFabrics::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read current fabric index");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::CurrentFabricIndex::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Remove single own fabric");
            ListFreer listFreer;
            chip::app::Clusters::OperationalCredentials::Commands::RemoveFabric::Type value;
            value.fabricIndex = ourFabricIndex;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                               OperationalCredentials::Commands::RemoveFabric::Id, value, chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestSystemCommandsSuite : public TestCommand
{
public:
    TestSystemCommandsSuite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("TestSystemCommands", 22, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("payload", &mPayload);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestSystemCommandsSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<chip::CharSpan> mPayload;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Stop the default accessory");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Stop::Type value;
            return Stop(kIdentityAlpha, value);
        }
        case 2: {
            LogStep(2, "Start the default accessory with no command line options");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Start::Type value;
            return Start(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "Stop the default accessory by key");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Stop::Type value;
            value.registerKey.Emplace();
            value.registerKey.Value() = chip::Span<const char>("defaultgarbage: not in length on purpose", 7);
            return Stop(kIdentityAlpha, value);
        }
        case 4: {
            LogStep(4, "Start the default accessory with discriminator command line option");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Start::Type value;
            value.discriminator.Emplace();
            value.discriminator.Value() = 1111U;
            return Start(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "Stop the default accessory");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Stop::Type value;
            return Stop(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6, "Start the default accessory with discriminator and port command line options");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Start::Type value;
            value.discriminator.Emplace();
            value.discriminator.Value() = 1111U;
            value.port.Emplace();
            value.port.Value() = 5560U;
            return Start(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "Stop the default accessory");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Stop::Type value;
            return Stop(kIdentityAlpha, value);
        }
        case 8: {
            LogStep(8, "Start the default accessory with minCommissioningTimeout only");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Start::Type value;
            value.minCommissioningTimeout.Emplace();
            value.minCommissioningTimeout.Value() = 10U;
            return Start(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "Stop the default accessory");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Stop::Type value;
            return Stop(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "Start the default accessory by key with all command line options");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Start::Type value;
            value.registerKey.Emplace();
            value.registerKey.Value() = chip::Span<const char>("defaultgarbage: not in length on purpose", 7);
            value.discriminator.Emplace();
            value.discriminator.Value() = 1111U;
            value.port.Emplace();
            value.port.Value() = 5560U;
            value.kvs.Emplace();
            value.kvs.Value() = chip::Span<const char>("/tmp/chip_kvs_defaultgarbage: not in length on purpose", 21);
            value.minCommissioningTimeout.Emplace();
            value.minCommissioningTimeout.Value() = 10U;
            return Start(kIdentityAlpha, value);
        }
        case 11: {
            LogStep(11, "Start a second accessory with all command line options");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Start::Type value;
            value.registerKey.Emplace();
            value.registerKey.Value() = chip::Span<const char>("chip-lock-appgarbage: not in length on purpose", 13);
            value.discriminator.Emplace();
            value.discriminator.Value() = 50U;
            value.port.Emplace();
            value.port.Value() = 5561U;
            value.kvs.Emplace();
            value.kvs.Value() = chip::Span<const char>("/tmp/chip_kvs_lockgarbage: not in length on purpose", 18);
            return Start(kIdentityAlpha, value);
        }
        case 12: {
            LogStep(12, "Commission second accessory from alpha");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = 3735928559ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0IX4122-.548G00", 22);
            return PairWithCode(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "Wait for the second commissioned device to be retrieved for alpha");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = 3735928559ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14, "Stop the second accessory");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Stop::Type value;
            value.registerKey.Emplace();
            value.registerKey.Value() = chip::Span<const char>("chip-lock-appgarbage: not in length on purpose", 13);
            return Stop(kIdentityAlpha, value);
        }
        case 15: {
            LogStep(15, "Start a second accessory with different KVS");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Start::Type value;
            value.registerKey.Emplace();
            value.registerKey.Value() = chip::Span<const char>("chip-lock-appgarbage: not in length on purpose", 13);
            value.discriminator.Emplace();
            value.discriminator.Value() = 50U;
            value.port.Emplace();
            value.port.Value() = 5561U;
            value.kvs.Emplace();
            value.kvs.Value() = chip::Span<const char>("/tmp/chip_kvs_lock2garbage: not in length on purpose", 19);
            return Start(kIdentityAlpha, value);
        }
        case 16: {
            LogStep(16, "Reboot the default accessory");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
            return Reboot(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17, "Reboot the default accessory by key");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
            value.registerKey.Emplace();
            value.registerKey.Value() = chip::Span<const char>("defaultgarbage: not in length on purpose", 7);
            return Reboot(kIdentityAlpha, value);
        }
        case 18: {
            LogStep(18, "Reboot the second accessory");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
            value.registerKey.Emplace();
            value.registerKey.Value() = chip::Span<const char>("chip-lock-appgarbage: not in length on purpose", 13);
            return Reboot(kIdentityAlpha, value);
        }
        case 19: {
            LogStep(19, "Factory Reset the default accessory");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::FactoryReset::Type value;
            return FactoryReset(kIdentityAlpha, value);
        }
        case 20: {
            LogStep(20, "Factory Reset the default accessory by key");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::FactoryReset::Type value;
            value.registerKey.Emplace();
            value.registerKey.Value() = chip::Span<const char>("defaultgarbage: not in length on purpose", 7);
            return FactoryReset(kIdentityAlpha, value);
        }
        case 21: {
            LogStep(21, "Factory Reset the second accessory");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::FactoryReset::Type value;
            value.registerKey.Emplace();
            value.registerKey.Value() = chip::Span<const char>("chip-lock-appgarbage: not in length on purpose", 13);
            return FactoryReset(kIdentityAlpha, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestBindingSuite : public TestCommand
{
public:
    TestBindingSuite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("TestBinding", 9, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestBindingSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::Binding::Structs::TargetStruct::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("binding", iter_0, 0));
                }
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::Binding::Structs::TargetStruct::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("binding", iter_0, 0));
                    VerifyOrReturn(CheckValuePresent("binding[0].group", iter_0.GetValue().group));
                    VerifyOrReturn(CheckValue("binding[0].group.Value()", iter_0.GetValue().group.Value(), 1U));
                    VerifyOrReturn(CheckValue("binding[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("binding", iter_0, 1));
                    VerifyOrReturn(CheckValuePresent("binding[1].node", iter_0.GetValue().node));
                    VerifyOrReturn(CheckValue("binding[1].node.Value()", iter_0.GetValue().node.Value(), 1ULL));
                    VerifyOrReturn(CheckValuePresent("binding[1].endpoint", iter_0.GetValue().endpoint));
                    VerifyOrReturn(CheckValue("binding[1].endpoint.Value()", iter_0.GetValue().endpoint.Value(), 1U));
                    VerifyOrReturn(CheckValuePresent("binding[1].cluster", iter_0.GetValue().cluster));
                    VerifyOrReturn(CheckValue("binding[1].cluster.Value()", iter_0.GetValue().cluster.Value(), 6UL));
                    VerifyOrReturn(CheckValue("binding[1].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("binding", iter_0, 2));
                    VerifyOrReturn(CheckValuePresent("binding[2].node", iter_0.GetValue().node));
                    VerifyOrReturn(CheckValue("binding[2].node.Value()", iter_0.GetValue().node.Value(), 2ULL));
                    VerifyOrReturn(CheckValuePresent("binding[2].endpoint", iter_0.GetValue().endpoint));
                    VerifyOrReturn(CheckValue("binding[2].endpoint.Value()", iter_0.GetValue().endpoint.Value(), 1U));
                    VerifyOrReturn(CheckValue("binding[2].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("binding", iter_0, 3));
                }
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::Binding::Structs::TargetStruct::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("binding", iter_0, 0));
                    VerifyOrReturn(CheckValuePresent("binding[0].node", iter_0.GetValue().node));
                    VerifyOrReturn(CheckValue("binding[0].node.Value()", iter_0.GetValue().node.Value(), 3ULL));
                    VerifyOrReturn(CheckValuePresent("binding[0].endpoint", iter_0.GetValue().endpoint));
                    VerifyOrReturn(CheckValue("binding[0].endpoint.Value()", iter_0.GetValue().endpoint.Value(), 1U));
                    VerifyOrReturn(CheckValue("binding[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("binding", iter_0, 1));
                }
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::Binding::Structs::TargetStruct::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("binding", iter_0, 0));
                    VerifyOrReturn(CheckValuePresent("binding[0].group", iter_0.GetValue().group));
                    VerifyOrReturn(CheckValue("binding[0].group.Value()", iter_0.GetValue().group.Value(), 1U));
                    VerifyOrReturn(CheckValue("binding[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("binding", iter_0, 1));
                    VerifyOrReturn(CheckValuePresent("binding[1].node", iter_0.GetValue().node));
                    VerifyOrReturn(CheckValue("binding[1].node.Value()", iter_0.GetValue().node.Value(), 1ULL));
                    VerifyOrReturn(CheckValuePresent("binding[1].endpoint", iter_0.GetValue().endpoint));
                    VerifyOrReturn(CheckValue("binding[1].endpoint.Value()", iter_0.GetValue().endpoint.Value(), 1U));
                    VerifyOrReturn(CheckValuePresent("binding[1].cluster", iter_0.GetValue().cluster));
                    VerifyOrReturn(CheckValue("binding[1].cluster.Value()", iter_0.GetValue().cluster.Value(), 6UL));
                    VerifyOrReturn(CheckValue("binding[1].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("binding", iter_0, 2));
                    VerifyOrReturn(CheckValuePresent("binding[2].node", iter_0.GetValue().node));
                    VerifyOrReturn(CheckValue("binding[2].node.Value()", iter_0.GetValue().node.Value(), 2ULL));
                    VerifyOrReturn(CheckValuePresent("binding[2].endpoint", iter_0.GetValue().endpoint));
                    VerifyOrReturn(CheckValue("binding[2].endpoint.Value()", iter_0.GetValue().endpoint.Value(), 1U));
                    VerifyOrReturn(CheckValue("binding[2].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("binding", iter_0, 3));
                }
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Write empty binding table");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::Binding::Structs::TargetStruct::Type> value;

            value = chip::app::DataModel::List<chip::app::Clusters::Binding::Structs::TargetStruct::Type>();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Binding::Id, Binding::Attributes::Binding::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read empty binding table");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Binding::Id, Binding::Attributes::Binding::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Write invalid binding table");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::Binding::Structs::TargetStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::Binding::Structs::TargetStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].fabricIndex = 0U;

                listHolder_0->mList[1].node.Emplace();
                listHolder_0->mList[1].node.Value() = 1ULL;
                listHolder_0->mList[1].group.Emplace();
                listHolder_0->mList[1].group.Value() = 1U;
                listHolder_0->mList[1].endpoint.Emplace();
                listHolder_0->mList[1].endpoint.Value() = 1U;
                listHolder_0->mList[1].cluster.Emplace();
                listHolder_0->mList[1].cluster.Value() = 6UL;
                listHolder_0->mList[1].fabricIndex     = 0U;

                value =
                    chip::app::DataModel::List<chip::app::Clusters::Binding::Structs::TargetStruct::Type>(listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Binding::Id, Binding::Attributes::Binding::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Write binding table (endpoint 1)");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::Binding::Structs::TargetStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::Binding::Structs::TargetStruct::Type>(3);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].group.Emplace();
                listHolder_0->mList[0].group.Value() = 1U;
                listHolder_0->mList[0].fabricIndex   = 0U;

                listHolder_0->mList[1].node.Emplace();
                listHolder_0->mList[1].node.Value() = 1ULL;
                listHolder_0->mList[1].endpoint.Emplace();
                listHolder_0->mList[1].endpoint.Value() = 1U;
                listHolder_0->mList[1].cluster.Emplace();
                listHolder_0->mList[1].cluster.Value() = 6UL;
                listHolder_0->mList[1].fabricIndex     = 0U;

                listHolder_0->mList[2].node.Emplace();
                listHolder_0->mList[2].node.Value() = 2ULL;
                listHolder_0->mList[2].endpoint.Emplace();
                listHolder_0->mList[2].endpoint.Value() = 1U;
                listHolder_0->mList[2].fabricIndex      = 0U;

                value =
                    chip::app::DataModel::List<chip::app::Clusters::Binding::Structs::TargetStruct::Type>(listHolder_0->mList, 3);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Binding::Id, Binding::Attributes::Binding::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read binding table (endpoint 1)");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Binding::Id, Binding::Attributes::Binding::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Write binding table (endpoint 0)");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::Binding::Structs::TargetStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::Binding::Structs::TargetStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].node.Emplace();
                listHolder_0->mList[0].node.Value() = 3ULL;
                listHolder_0->mList[0].endpoint.Emplace();
                listHolder_0->mList[0].endpoint.Value() = 1U;
                listHolder_0->mList[0].fabricIndex      = 0U;

                value =
                    chip::app::DataModel::List<chip::app::Clusters::Binding::Structs::TargetStruct::Type>(listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), Binding::Id, Binding::Attributes::Binding::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read binding table (endpoint 0)");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Binding::Id, Binding::Attributes::Binding::Id, true,
                                 chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Verify endpoint 1 not changed");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Binding::Id, Binding::Attributes::Binding::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestUserLabelClusterSuite : public TestCommand
{
public:
    TestUserLabelClusterSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestUserLabelCluster", 9, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestUserLabelClusterSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::UserLabel::Structs::LabelStruct::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("labelList", iter_0, 0));
                    VerifyOrReturn(CheckValueAsString("labelList[0].label", iter_0.GetValue().label, chip::CharSpan("room", 4)));
                    VerifyOrReturn(
                        CheckValueAsString("labelList[0].value", iter_0.GetValue().value, chip::CharSpan("bedroom 1", 9)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("labelList", iter_0, 1));
                    VerifyOrReturn(
                        CheckValueAsString("labelList[1].label", iter_0.GetValue().label, chip::CharSpan("orientation", 11)));
                    VerifyOrReturn(CheckValueAsString("labelList[1].value", iter_0.GetValue().value, chip::CharSpan("South", 5)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("labelList", iter_0, 2));
                    VerifyOrReturn(CheckValueAsString("labelList[2].label", iter_0.GetValue().label, chip::CharSpan("floor", 5)));
                    VerifyOrReturn(CheckValueAsString("labelList[2].value", iter_0.GetValue().value, chip::CharSpan("2", 1)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("labelList", iter_0, 3));
                    VerifyOrReturn(
                        CheckValueAsString("labelList[3].label", iter_0.GetValue().label, chip::CharSpan("direction", 9)));
                    VerifyOrReturn(CheckValueAsString("labelList[3].value", iter_0.GetValue().value, chip::CharSpan("down", 4)));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("labelList", iter_0, 4));
                }
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::UserLabel::Structs::LabelStruct::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("labelList", iter_0, 0));
                }
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::UserLabel::Structs::LabelStruct::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("labelList", iter_0, 0));
                    VerifyOrReturn(CheckValueAsString("labelList[0].label", iter_0.GetValue().label, chip::CharSpan("room", 4)));
                    VerifyOrReturn(
                        CheckValueAsString("labelList[0].value", iter_0.GetValue().value, chip::CharSpan("bedroom 2", 9)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("labelList", iter_0, 1));
                    VerifyOrReturn(
                        CheckValueAsString("labelList[1].label", iter_0.GetValue().label, chip::CharSpan("orientation", 11)));
                    VerifyOrReturn(CheckValueAsString("labelList[1].value", iter_0.GetValue().value, chip::CharSpan("North", 5)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("labelList", iter_0, 2));
                    VerifyOrReturn(CheckValueAsString("labelList[2].label", iter_0.GetValue().label, chip::CharSpan("floor", 5)));
                    VerifyOrReturn(CheckValueAsString("labelList[2].value", iter_0.GetValue().value, chip::CharSpan("5", 1)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("labelList", iter_0, 3));
                    VerifyOrReturn(
                        CheckValueAsString("labelList[3].label", iter_0.GetValue().label, chip::CharSpan("direction", 9)));
                    VerifyOrReturn(CheckValueAsString("labelList[3].value", iter_0.GetValue().value, chip::CharSpan("up", 2)));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("labelList", iter_0, 4));
                }
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Commit User Label List");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::UserLabel::Structs::LabelStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::UserLabel::Structs::LabelStruct::Type>(4);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].label = chip::Span<const char>("roomgarbage: not in length on purpose", 4);
                listHolder_0->mList[0].value = chip::Span<const char>("bedroom 1garbage: not in length on purpose", 9);

                listHolder_0->mList[1].label = chip::Span<const char>("orientationgarbage: not in length on purpose", 11);
                listHolder_0->mList[1].value = chip::Span<const char>("Southgarbage: not in length on purpose", 5);

                listHolder_0->mList[2].label = chip::Span<const char>("floorgarbage: not in length on purpose", 5);
                listHolder_0->mList[2].value = chip::Span<const char>("2garbage: not in length on purpose", 1);

                listHolder_0->mList[3].label = chip::Span<const char>("directiongarbage: not in length on purpose", 9);
                listHolder_0->mList[3].value = chip::Span<const char>("downgarbage: not in length on purpose", 4);

                value =
                    chip::app::DataModel::List<chip::app::Clusters::UserLabel::Structs::LabelStruct::Type>(listHolder_0->mList, 4);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), UserLabel::Id, UserLabel::Attributes::LabelList::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Verify committed User Label List");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), UserLabel::Id, UserLabel::Attributes::LabelList::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Clear User Label List");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::UserLabel::Structs::LabelStruct::Type> value;

            value = chip::app::DataModel::List<chip::app::Clusters::UserLabel::Structs::LabelStruct::Type>();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), UserLabel::Id, UserLabel::Attributes::LabelList::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read User Label List");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), UserLabel::Id, UserLabel::Attributes::LabelList::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Write User Label List");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::UserLabel::Structs::LabelStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::UserLabel::Structs::LabelStruct::Type>(4);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].label = chip::Span<const char>("roomgarbage: not in length on purpose", 4);
                listHolder_0->mList[0].value = chip::Span<const char>("bedroom 2garbage: not in length on purpose", 9);

                listHolder_0->mList[1].label = chip::Span<const char>("orientationgarbage: not in length on purpose", 11);
                listHolder_0->mList[1].value = chip::Span<const char>("Northgarbage: not in length on purpose", 5);

                listHolder_0->mList[2].label = chip::Span<const char>("floorgarbage: not in length on purpose", 5);
                listHolder_0->mList[2].value = chip::Span<const char>("5garbage: not in length on purpose", 1);

                listHolder_0->mList[3].label = chip::Span<const char>("directiongarbage: not in length on purpose", 9);
                listHolder_0->mList[3].value = chip::Span<const char>("upgarbage: not in length on purpose", 2);

                value =
                    chip::app::DataModel::List<chip::app::Clusters::UserLabel::Structs::LabelStruct::Type>(listHolder_0->mList, 4);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), UserLabel::Id, UserLabel::Attributes::LabelList::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Reboot target device");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
            return Reboot(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 8: {
            LogStep(8, "Verify User Label List after reboot");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), UserLabel::Id, UserLabel::Attributes::LabelList::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestUserLabelClusterConstraintsSuite : public TestCommand
{
public:
    TestUserLabelClusterConstraintsSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestUserLabelClusterConstraints", 3, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestUserLabelClusterConstraintsSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Attempt to write overly long item for label");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::UserLabel::Structs::LabelStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::UserLabel::Structs::LabelStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].label =
                    chip::Span<const char>("this is longer than sixteen charactersgarbage: not in length on purpose", 38);
                listHolder_0->mList[0].value = chip::Span<const char>("bedroom 2garbage: not in length on purpose", 9);

                value =
                    chip::app::DataModel::List<chip::app::Clusters::UserLabel::Structs::LabelStruct::Type>(listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), UserLabel::Id, UserLabel::Attributes::LabelList::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Attempt to write overly long item for value");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::UserLabel::Structs::LabelStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::UserLabel::Structs::LabelStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].label = chip::Span<const char>("testgarbage: not in length on purpose", 4);
                listHolder_0->mList[0].value =
                    chip::Span<const char>("this is longer than sixteen charactersgarbage: not in length on purpose", 38);

                value =
                    chip::app::DataModel::List<chip::app::Clusters::UserLabel::Structs::LabelStruct::Type>(listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), UserLabel::Id, UserLabel::Attributes::LabelList::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestArmFailSafeSuite : public TestCommand
{
public:
    TestArmFailSafeSuite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("TestArmFailSafe", 9, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestArmFailSafeSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::OperationalCredentials::Structs::FabricDescriptor::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 0));
                    VerifyOrReturn(CheckValueAsString("fabrics[0].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("fabrics", iter_0, 1));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::GeneralCommissioning::Commands::ArmFailSafeResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("errorCode", value.errorCode, 0U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("nodeLabel", value, chip::CharSpan("", 0)));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILSAFE_REQUIRED));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILSAFE_REQUIRED));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILSAFE_REQUIRED));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILSAFE_REQUIRED));
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Reboot target device");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
            return Reboot(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Wait for the alpha device to be retrieved ");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 2: {
            LogStep(2, "Query fabrics list");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::Fabrics::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "ArmFailSafe on target device with timeout 0");
            ListFreer listFreer;
            chip::app::Clusters::GeneralCommissioning::Commands::ArmFailSafe::Type value;
            value.expiryLengthSeconds = 0U;
            value.breadcrumb          = 0ULL;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                               GeneralCommissioning::Commands::ArmFailSafe::Id, value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Reads NodeLabel mandatory attribute of target device");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::NodeLabel::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Invoke AddTrustedRootCertificate without fail-safe");
            ListFreer listFreer;
            chip::app::Clusters::OperationalCredentials::Commands::AddTrustedRootCertificate::Type value;
            value.rootCertificate = chip::ByteSpan(chip::Uint8::from_const_char("00000000garbage: not in length on purpose"), 8);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                               OperationalCredentials::Commands::AddTrustedRootCertificate::Id, value, chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Invoke AddNOC without fail-safe");
            ListFreer listFreer;
            chip::app::Clusters::OperationalCredentials::Commands::AddNOC::Type value;
            value.NOCValue = chip::ByteSpan(chip::Uint8::from_const_char("00112233garbage: not in length on purpose"), 8);
            value.IPKValue = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\000\001\002\003\004\005\006\007\000\001\002\003\004\005\006\007garbage: not in length on purpose"),
                16);
            value.caseAdminSubject = 1234ULL;
            value.adminVendorId    = static_cast<chip::VendorId>(65521);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                               OperationalCredentials::Commands::AddNOC::Id, value, chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "Invoke UpdateNOC without fail-safe");
            ListFreer listFreer;
            chip::app::Clusters::OperationalCredentials::Commands::UpdateNOC::Type value;
            value.NOCValue = chip::ByteSpan(chip::Uint8::from_const_char("00112233garbage: not in length on purpose"), 8);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                               OperationalCredentials::Commands::UpdateNOC::Id, value, chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "Invoke CSRRequest without fail-safe");
            ListFreer listFreer;
            chip::app::Clusters::OperationalCredentials::Commands::CSRRequest::Type value;
            value.CSRNonce = chip::ByteSpan(
                chip::Uint8::from_const_char("\000\001\002\003\004\005\006\007\000\001\002\003\004\005\006\007\000\001\002\003\004"
                                             "\005\006\007\000\001\002\003\004\005\006\007garbage: not in length on purpose"),
                32);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                               OperationalCredentials::Commands::CSRRequest::Id, value, chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestFanControlSuite : public TestCommand
{
public:
    TestFanControlSuite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("TestFanControl", 25, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestFanControlSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::FanControl::FanModeType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("fanMode", value, 3U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::FanControl::FanModeSequenceType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("fanModeSequence", value, 5U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("percentSetting", value));
                VerifyOrReturn(CheckValue("percentSetting.Value()", value.Value(), 84U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("speedSetting", value));
                VerifyOrReturn(CheckValue("speedSetting.Value()", value.Value(), 84U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("speedCurrent", value, 84U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("percentSetting", value));
                VerifyOrReturn(CheckValue("percentSetting.Value()", value.Value(), 84U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("speedSetting", value));
                VerifyOrReturn(CheckValue("speedSetting.Value()", value.Value(), 73U));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("percentSetting", value));
                VerifyOrReturn(CheckValue("percentSetting.Value()", value.Value(), 73U));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("percentCurrent", value, 73U));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("speedSetting", value));
                VerifyOrReturn(CheckValue("speedSetting.Value()", value.Value(), 73U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("percentSetting", value));
                VerifyOrReturn(CheckValue("percentSetting.Value()", value.Value(), 0U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("percentCurrent", value, 0U));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("speedSetting", value));
                VerifyOrReturn(CheckValue("speedSetting.Value()", value.Value(), 0U));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("speedCurrent", value, 0U));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("percentSetting", value));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("speedSetting", value));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Write fan mode");
            ListFreer listFreer;
            chip::app::Clusters::FanControl::FanModeType value;
            value = static_cast<chip::app::Clusters::FanControl::FanModeType>(3);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::FanMode::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read back fan mode");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::FanMode::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Write fan mode sequence");
            ListFreer listFreer;
            chip::app::Clusters::FanControl::FanModeSequenceType value;
            value = static_cast<chip::app::Clusters::FanControl::FanModeSequenceType>(5);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::FanModeSequence::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read back fan mode sequence");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::FanModeSequence::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Write percent setting");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 84U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::PercentSetting::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read back percent setting");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::PercentSetting::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read back speed setting");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::SpeedSetting::Id, true,
                                 chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read back speed current");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::SpeedCurrent::Id, true,
                                 chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Write percent setting");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::PercentSetting::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Read back percent setting");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::PercentSetting::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Write speed setting");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 73U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::SpeedSetting::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Read back speed setting");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::SpeedSetting::Id, true,
                                 chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Read back percent setting");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::PercentSetting::Id, true,
                                 chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Read back percent current");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::PercentCurrent::Id, true,
                                 chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Write speed setting");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::SpeedSetting::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Read back speed setting");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::SpeedSetting::Id, true,
                                 chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Write fan mode");
            ListFreer listFreer;
            chip::app::Clusters::FanControl::FanModeType value;
            value = static_cast<chip::app::Clusters::FanControl::FanModeType>(0);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::FanMode::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Read back percent setting");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::PercentSetting::Id, true,
                                 chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Read back percent current");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::PercentCurrent::Id, true,
                                 chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Read back speed setting");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::SpeedSetting::Id, true,
                                 chip::NullOptional);
        }
        case 21: {
            LogStep(21, "Read back speed current");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::SpeedCurrent::Id, true,
                                 chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Write fan mode");
            ListFreer listFreer;
            chip::app::Clusters::FanControl::FanModeType value;
            value = static_cast<chip::app::Clusters::FanControl::FanModeType>(5);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::FanMode::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "Read back percent setting");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::PercentSetting::Id, true,
                                 chip::NullOptional);
        }
        case 24: {
            LogStep(24, "Read back speed setting");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::SpeedSetting::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestAccessControlConstraintsSuite : public TestCommand
{
public:
    TestAccessControlConstraintsSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestAccessControlConstraints", 11, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestAccessControlConstraintsSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Constraint error: PASE reserved for future (TC-ACL-2.4 step 29)");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(5);
                listHolder_0->mList[0].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 112233ULL;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 1U;

                listHolder_0->mList[1].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(3);
                listHolder_0->mList[1].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(1);
                listHolder_0->mList[1].subjects.SetNonNull();

                listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>();
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Constraint error: Invalid combination administer + group (TC-ACL-2.4 step 31)");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(5);
                listHolder_0->mList[0].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 112233ULL;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 1U;

                listHolder_0->mList[1].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(5);
                listHolder_0->mList[1].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(3);
                listHolder_0->mList[1].subjects.SetNonNull();

                listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>();
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Constraint error:  Invalid auth mode (TC-ACL-2.4 step 33)");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(5);
                listHolder_0->mList[0].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 112233ULL;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 1U;

                listHolder_0->mList[1].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(3);
                listHolder_0->mList[1].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(4);
                listHolder_0->mList[1].subjects.SetNonNull();

                listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>();
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Constraint error:  Invalid subject (TC-ACL-2.4 step 34)");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(5);
                listHolder_0->mList[0].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 112233ULL;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 1U;

                listHolder_0->mList[1].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(3);
                listHolder_0->mList[1].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(2);
                listHolder_0->mList[1].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 0ULL;
                    listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Constraint error:  Invalid target (TC-ACL-2.4 step 38)");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(5);
                listHolder_0->mList[0].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 112233ULL;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 1U;

                listHolder_0->mList[1].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(3);
                listHolder_0->mList[1].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(2);
                listHolder_0->mList[1].subjects.SetNull();
                listHolder_0->mList[1].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(1);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNull();
                    listHolder_3->mList[0].endpoint.SetNull();
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_0->mList[1].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              1);
                }
                listHolder_0->mList[1].fabricIndex = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Constraint error:  target has both endpoint and device type (TC-ACL-2.4 step 42)");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(5);
                listHolder_0->mList[0].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 112233ULL;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 1U;

                listHolder_0->mList[1].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(3);
                listHolder_0->mList[1].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(2);
                listHolder_0->mList[1].subjects.SetNull();
                listHolder_0->mList[1].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(1);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNull();
                    listHolder_3->mList[0].endpoint.SetNonNull();
                    listHolder_3->mList[0].endpoint.Value() = 22U;
                    listHolder_3->mList[0].deviceType.SetNonNull();
                    listHolder_3->mList[0].deviceType.Value() = 33UL;

                    listHolder_0->mList[1].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              1);
                }
                listHolder_0->mList[1].fabricIndex = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Constraint error: Invalid privilege value step 32)");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(5);
                listHolder_0->mList[0].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 112233ULL;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 1U;

                listHolder_0->mList[1].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(6);
                listHolder_0->mList[1].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(2);
                listHolder_0->mList[1].subjects.SetNull();
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Constraint error: invalid subject 0xFFFF_FFFF_FFFF_FFFF (TC-ACL-2.4 step 35)");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(5);
                listHolder_0->mList[0].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 112233ULL;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 1U;

                listHolder_0->mList[1].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(3);
                listHolder_0->mList[1].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(2);
                listHolder_0->mList[1].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 18446744073709551615ULL;
                    listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Constraint error: invalid subject 0xFFFF_FFFD_0000_0000 (TC-ACL-2.4 step 36)");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(5);
                listHolder_0->mList[0].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 112233ULL;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 1U;

                listHolder_0->mList[1].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(3);
                listHolder_0->mList[1].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(2);
                listHolder_0->mList[1].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 18446744060824649728ULL;
                    listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Constraint error: invalid subject 0xFFFF_FFFF_FFFF_0000 (TC-ACL-2.4 step 37)");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(5);
                listHolder_0->mList[0].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 112233ULL;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 1U;

                listHolder_0->mList[1].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(3);
                listHolder_0->mList[1].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(2);
                listHolder_0->mList[1].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 18446744073709486080ULL;
                    listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestLevelControlWithOnOffDependencySuite : public TestCommand
{
public:
    TestLevelControlWithOnOffDependencySuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestLevelControlWithOnOffDependency", 33, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestLevelControlWithOnOffDependencySuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 1U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOffTransitionTime", value, 0U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("onLevel", value));
                VerifyOrReturn(CheckValue("onLevel.Value()", value.Value(), 254U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("minLevel", value, 1U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 254U));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 1U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 127U));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("onLevel", value));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 127U));
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 127U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Sends a MoveToLevel command to set CurrentLevel to min value");
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::MoveToLevel::Type value;
            value.level = 1U;
            value.transitionTime.SetNonNull();
            value.transitionTime.Value() = 0U;
            value.optionsMask            = 1U;
            value.optionsOverride        = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Wait 100 ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "Reads CurrentLevel attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Write OnOffTransitionTime attribute");
            ListFreer listFreer;
            uint16_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id,
                                  LevelControl::Attributes::OnOffTransitionTime::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Wait 100 ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6, "Read OnOffTransitionTime attribute");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id,
                                 LevelControl::Attributes::OnOffTransitionTime::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Write OnLevel attribute");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 254U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::OnLevel::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Wait 100 ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "Read OnLevel attribute");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::OnLevel::Id, true,
                                 chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Read MinValue attribute");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::MinLevel::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Send On Command");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "Check on/off attribute value is true after on command");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Wait OnOffTransitionTime");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14, "If OnLevel is defined, check CurrentLevel is OnLevel value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Send Off Command");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 16: {
            LogStep(16, "Check on/off attribute value is false after off command");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Wait OnOffTransitionTime");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 0UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 18: {
            LogStep(18, "If OnLevel is defined, check CurrentLevel is min value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Sends a MoveToLevel command to set CurrentLevel to a mid value");
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::MoveToLevel::Type value;
            value.level = 127U;
            value.transitionTime.SetNonNull();
            value.transitionTime.Value() = 0U;
            value.optionsMask            = 1U;
            value.optionsOverride        = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                               chip::NullOptional

            );
        }
        case 20: {
            LogStep(20, "Wait 100 ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 21: {
            LogStep(21, "Reads CurrentLevel attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Set OnLevel attribute to null");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::OnLevel::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "Wait 100 ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 24: {
            LogStep(24, "Read OnLevel attribute");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::OnLevel::Id, true,
                                 chip::NullOptional);
        }
        case 25: {
            LogStep(25, "Send On Command");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 26: {
            LogStep(26, "Check on/off attribute value is true after on command");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 27: {
            LogStep(27, "Wait OnOffTransitionTime");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 28: {
            LogStep(28, "If OnLevel is not defined, check CurrentLevel is restored");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 29: {
            LogStep(29, "Send Off Command");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 30: {
            LogStep(30, "Check on/off attribute value is false after off command");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 31: {
            LogStep(31, "Wait OnOffTransitionTime");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 0UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 32: {
            LogStep(32, "If OnLevel is not defined, check CurrentLevel is restored");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestCommissioningWindowSuite : public TestCommand
{
public:
    TestCommissioningWindowSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestCommissioningWindow", 28, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("nodeId2", 0, UINT64_MAX, &mNodeId2);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("cluster", &mCluster);
        AddArgument("discriminator", 0, UINT16_MAX, &mDiscriminator);
        AddArgument("payload", &mPayload);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestCommissioningWindowSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::NodeId> mNodeId2;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<uint16_t> mDiscriminator;
    chip::Optional<chip::CharSpan> mPayload;
    chip::Optional<uint16_t> mTimeout;

    uint8_t alphaIndex;
    uint8_t betaIndex;
    chip::app::DataModel::Nullable<uint16_t> adminVendorId;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                alphaIndex = value;
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatus value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("windowStatus", value, 0U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::FabricIndex> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("adminFabricIndex", value));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("adminVendorId", value));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatus value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("windowStatus", value, 2U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::FabricIndex> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("adminFabricIndex", value));
                VerifyOrReturn(CheckValue("adminFabricIndex.Value()", value.Value(), alphaIndex));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("value", value));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatus value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("windowStatus", value, 0U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::FabricIndex> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("adminFabricIndex", value));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("adminVendorId", value));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatus value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("windowStatus", value, 0U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::FabricIndex> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("adminFabricIndex", value));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("adminVendorId", value));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                betaIndex = value;
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatus value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("windowStatus", value, 2U));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::FabricIndex> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("adminFabricIndex", value));
                VerifyOrReturn(CheckValue("adminFabricIndex.Value()", value.Value(), betaIndex));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("value", value));
                adminVendorId = value;
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::OperationalCredentials::Commands::NOCResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatus value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("windowStatus", value, 2U));
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::FabricIndex> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("adminFabricIndex", value));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                if (adminVendorId.IsNull())
                {
                    VerifyOrReturn(CheckValueNull("adminVendorId", value));
                }
                else
                {
                    VerifyOrReturn(CheckValueNonNull("adminVendorId", value));
                    VerifyOrReturn(CheckValue("adminVendorId.Value()", value.Value(), adminVendorId.Value()));
                }
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved for alpha");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Get alpha's fabric index");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::CurrentFabricIndex::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Check that commissioning window is not open");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::WindowStatus::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Check that there is no AdminFabricIndex");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::AdminFabricIndex::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Check that there is no AdminVendorId");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::AdminVendorId::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Open Commissioning Window from alpha");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Check that commissioning window is open");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::WindowStatus::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Check the AdminFabricIndex");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::AdminFabricIndex::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Check the AdminVendorId is not null");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::AdminVendorId::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Close Commissioning Window");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::RevokeCommissioning::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::RevokeCommissioning::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 10: {
            LogStep(10, "Check that commissioning window is again not open");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::WindowStatus::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Check that again there is no AdminFabricIndex");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::AdminFabricIndex::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Check that again there is no AdminVendorId");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::AdminVendorId::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Open Commissioning Window from alpha again");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "Commission from beta");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 15: {
            LogStep(15, "Wait for the commissioned device to be retrieved for beta");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            return WaitForCommissionee(kIdentityBeta, value);
        }
        case 16: {
            LogStep(16, "Check that commissioning window is not open for the third time");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::WindowStatus::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Check that there is no AdminFabricIndex for the third time");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::AdminFabricIndex::Id, true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Check that there is no AdminVendorId for the third time");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::AdminVendorId::Id, true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Get beta's fabric index");
            return ReadAttribute(kIdentityBeta, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::CurrentFabricIndex::Id, true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Open Commissioning Window from beta");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityBeta, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 21: {
            LogStep(21, "Check that commissioning window is open again");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::WindowStatus::Id, true, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Check the AdminFabricIndex again");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::AdminFabricIndex::Id, true, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "Check the AdminVendorId is not null again");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::AdminVendorId::Id, true, chip::NullOptional);
        }
        case 24: {
            LogStep(24, "Remove beta fabric");
            ListFreer listFreer;
            chip::app::Clusters::OperationalCredentials::Commands::RemoveFabric::Type value;
            value.fabricIndex = betaIndex;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                               OperationalCredentials::Commands::RemoveFabric::Id, value, chip::NullOptional

            );
        }
        case 25: {
            LogStep(25, "Check that commissioning window is still open");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::WindowStatus::Id, true, chip::NullOptional);
        }
        case 26: {
            LogStep(26, "Check the AdminFabricIndex got reset");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::AdminFabricIndex::Id, true, chip::NullOptional);
        }
        case 27: {
            LogStep(27, "Check the AdminVendorId did not get reset");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::AdminVendorId::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestMultiAdminSuite : public TestCommand
{
public:
    TestMultiAdminSuite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("TestMultiAdmin", 18, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("nodeIdForDuplicateCommissioning", 0, UINT64_MAX, &mNodeIdForDuplicateCommissioning);
        AddArgument("nodeId2", 0, UINT64_MAX, &mNodeId2);
        AddArgument("nodeId3", 0, UINT64_MAX, &mNodeId3);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("discriminator", 0, UINT16_MAX, &mDiscriminator);
        AddArgument("payload", &mPayload);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestMultiAdminSuite()
    {
        if (readFromAlphaBuffer != nullptr)
        {
            chip::Platform::MemoryFree(readFromAlphaBuffer);
            readFromAlphaBuffer = nullptr;
        }
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::NodeId> mNodeIdForDuplicateCommissioning;
    chip::Optional<chip::NodeId> mNodeId2;
    chip::Optional<chip::NodeId> mNodeId3;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mDiscriminator;
    chip::Optional<chip::CharSpan> mPayload;
    chip::Optional<uint16_t> mTimeout;

    char * readFromAlphaBuffer = nullptr;
    chip::CharSpan readFromAlpha;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::OperationalCredentials::Structs::FabricDescriptor::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 0));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("fabrics", iter_0, 1));
                }
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("nodeLabel", value, chip::CharSpan("", 0)));
                if (readFromAlphaBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(readFromAlphaBuffer);
                }
                readFromAlphaBuffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.size()));
                memcpy(readFromAlphaBuffer, value.data(), value.size());
                readFromAlpha = chip::CharSpan(readFromAlphaBuffer, value.size());
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readFromAlpha));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Stop target device");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Stop::Type value;
            return Stop(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Start target device with the provided discriminator for basic commissioning advertisement");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Start::Type value;
            value.discriminator.Emplace();
            value.discriminator.Value() = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840U;
            return Start(kIdentityAlpha, value);
        }
        case 2: {
            LogStep(2, "Wait for the commissioned device to be retrieved for alpha");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "Commission from alpha when the commissioning window is not opened");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeIdForDuplicateCommissioning.HasValue() ? mNodeIdForDuplicateCommissioning.Value() : 17ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityAlpha, value);
        }
        case 4: {
            LogStep(4, "Open Commissioning Window from alpha");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "Commission from alpha again");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeIdForDuplicateCommissioning.HasValue() ? mNodeIdForDuplicateCommissioning.Value() : 17ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6, "Check that we just have the one fabric and did not add a new one");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::Fabrics::Id, false, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Close Commissioning Window after failed commissioning");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::RevokeCommissioning::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::RevokeCommissioning::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "Open Commissioning Window from alpha again");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "Commission from beta");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 10: {
            LogStep(10, "Wait for the commissioned device to be retrieved for beta");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            return WaitForCommissionee(kIdentityBeta, value);
        }
        case 11: {
            LogStep(11, "Open Commissioning Window from beta");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityBeta, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "Commission from gamma");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId3.HasValue() ? mNodeId3.Value() : 12586990ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityGamma, value);
        }
        case 13: {
            LogStep(13, "Wait for the commissioned device to be retrieved for gamma");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId3.HasValue() ? mNodeId3.Value() : 12586990ULL;
            return WaitForCommissionee(kIdentityGamma, value);
        }
        case 14: {
            LogStep(14, "read the mandatory attribute: NodeLabel from alpha");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::NodeLabel::Id, true,
                                 chip::NullOptional);
        }
        case 15: {
            LogStep(15, "write the mandatory attribute NodeLabel from beta");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("written from betagarbage: not in length on purpose", 17);
            return WriteAttribute(kIdentityBeta, GetEndpoint(0), Basic::Id, Basic::Attributes::NodeLabel::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "read the mandatory attribute: NodeLabel from gamma");
            return ReadAttribute(kIdentityGamma, GetEndpoint(0), Basic::Id, Basic::Attributes::NodeLabel::Id, true,
                                 chip::NullOptional);
        }
        case 17: {
            LogStep(17, "write the mandatory attribute NodeLabel back to default");
            ListFreer listFreer;
            chip::CharSpan value;
            value = readFromAlpha;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::NodeLabel::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGSW_1_1Suite : public TestCommand
{
public:
    Test_TC_DGSW_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGSW_1_1", 12, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGSW_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH reads the ClusterRevision from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), SoftwareDiagnostics::Id,
                                 SoftwareDiagnostics::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads the FeatureMap from DUT");
            VerifyOrDo(!ShouldSkip(" !DGSW.S.F00 "), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), SoftwareDiagnostics::Id,
                                 SoftwareDiagnostics::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Given DGSW.S.F00(Watermarks) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("DGSW.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), SoftwareDiagnostics::Id,
                                 SoftwareDiagnostics::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads AttributeList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), SoftwareDiagnostics::Id,
                                 SoftwareDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads optional attribute(ThreadMetrics) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGSW.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), SoftwareDiagnostics::Id,
                                 SoftwareDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH reads optional attribute(CurrentHeapFree) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGSW.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), SoftwareDiagnostics::Id,
                                 SoftwareDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH reads optional attribute(CurrentHeapUsed) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGSW.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), SoftwareDiagnostics::Id,
                                 SoftwareDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH reads Feature dependent attribute(CurrentHeapHighWatermark) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGSW.S.F00 || DGSW.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), SoftwareDiagnostics::Id,
                                 SoftwareDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "TH reads AcceptedCommandList from DUT");
            VerifyOrDo(!ShouldSkip("DGSW.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), SoftwareDiagnostics::Id,
                                 SoftwareDiagnostics::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "TH reads AcceptedCommandList from DUT");
            VerifyOrDo(!ShouldSkip(" !DGSW.S.F00 "), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), SoftwareDiagnostics::Id,
                                 SoftwareDiagnostics::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "TH reads GeneratedCommandList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), SoftwareDiagnostics::Id,
                                 SoftwareDiagnostics::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestSubscribe_OnOffSuite : public TestCommand
{
public:
    TestSubscribe_OnOffSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestSubscribe_OnOff", 7, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestSubscribe_OnOffSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, false));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, true));
            }
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, false));
            }
            shouldContinue = true;
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Set OnOff Attribute to false");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Subscribe OnOff Attribute");
            return SubscribeAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, 2, 5, true,
                                      chip::NullOptional, chip::NullOptional, /* autoResubscribe = */ chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Turn On the light to see attribute change");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Check for attribute report");
            return WaitForReport();
        }
        case 5: {
            LogStep(5, "Turn Off the light to see attribute change");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Check for attribute report");
            return WaitForReport();
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestSubscribe_AdministratorCommissioningSuite : public TestCommand
{
public:
    TestSubscribe_AdministratorCommissioningSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestSubscribe_AdministratorCommissioning", 17, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("ourVendorId", 0, UINT16_MAX, &mOurVendorId);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestSubscribe_AdministratorCommissioningSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mOurVendorId;
    chip::Optional<uint16_t> mTimeout;

    uint8_t ourFabricIndex;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                ourFabricIndex = value;
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatus value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("windowStatus", value, 0U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatus value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("windowStatus", value, 2U));
            }
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatus value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("windowStatus", value, 0U));
            }
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("adminVendorId", value));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("adminVendorId", value));
                VerifyOrReturn(
                    CheckValue("adminVendorId.Value()", value.Value(), mOurVendorId.HasValue() ? mOurVendorId.Value() : 65521U));
            }
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("adminVendorId", value));
            }
            shouldContinue = true;
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::FabricIndex> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("adminFabricIndex", value));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::FabricIndex> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("adminFabricIndex", value));
                VerifyOrReturn(CheckValue("adminFabricIndex.Value()", value.Value(), ourFabricIndex));
            }
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::FabricIndex> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("adminFabricIndex", value));
            }
            shouldContinue = true;
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Get ourfabric index");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::CurrentFabricIndex::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Subscribe WindowStatus Attribute");
            return SubscribeAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                      AdministratorCommissioning::Attributes::WindowStatus::Id, 2, 50, true, chip::NullOptional,
                                      chip::NullOptional, /* autoResubscribe = */ chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Open the commissioning window 1");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Check for first attribute report for WindowStatus");
            return WaitForReport();
        }
        case 5: {
            LogStep(5, "Close the commissioning window 1");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::RevokeCommissioning::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::RevokeCommissioning::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Check for second attribute report for WindowStatus");
            return WaitForReport();
        }
        case 7: {
            LogStep(7, "Subscribe AdminVendorId Attribute");
            return SubscribeAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                      AdministratorCommissioning::Attributes::AdminVendorId::Id, 2, 50, true, chip::NullOptional,
                                      chip::NullOptional, /* autoResubscribe = */ chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Open the commissioning window 2");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "Check for first attribute report for AdminVendorId");
            return WaitForReport();
        }
        case 10: {
            LogStep(10, "Close the commissioning window 2");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::RevokeCommissioning::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::RevokeCommissioning::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 11: {
            LogStep(11, "Check for second attribute report for AdminVendorId");
            return WaitForReport();
        }
        case 12: {
            LogStep(12, "Subscribe AdminFabricIndex Attribute");
            return SubscribeAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                      AdministratorCommissioning::Attributes::AdminFabricIndex::Id, 2, 50, true, chip::NullOptional,
                                      chip::NullOptional, /* autoResubscribe = */ chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Open the commissioning window 3");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "Check for first attribute report for AdminFabricIndex");
            return WaitForReport();
        }
        case 15: {
            LogStep(15, "Close the commissioning window 2");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::RevokeCommissioning::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::RevokeCommissioning::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 16: {
            LogStep(16, "Check for second attribute report for AdminFabricIndex");
            return WaitForReport();
        }
        }
        return CHIP_NO_ERROR;
    }
};

class DL_UsersAndCredentialsSuite : public TestCommand
{
public:
    DL_UsersAndCredentialsSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("DL_UsersAndCredentials", 122, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~DL_UsersAndCredentialsSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    uint16_t NumberOfTotalUsersSupported;
    uint16_t NumberOfPINUsersSupported;
    uint16_t NumberOfRFIDUsersSupported;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetUserResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValueNull("userName", value.userName));
                VerifyOrReturn(CheckValueNull("userUniqueId", value.userUniqueId));
                VerifyOrReturn(CheckValueNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValueNull("userType", value.userType));
                VerifyOrReturn(CheckValueNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValueNull("credentials", value.credentials));
                VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("numberOfTotalUsersSupported", value, 10U));
                NumberOfTotalUsersSupported = value;
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetUserResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValueNonNull("userName", value.userName));
                VerifyOrReturn(CheckValueAsString("userName.Value()", value.userName.Value(), chip::CharSpan("", 0)));
                VerifyOrReturn(CheckValueNull("userUniqueId", value.userUniqueId));
                VerifyOrReturn(CheckValueNonNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValue("userStatus.Value()", value.userStatus.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("userType", value.userType));
                VerifyOrReturn(CheckValue("userType.Value()", value.userType.Value(), 0U));
                VerifyOrReturn(CheckValueNonNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValue("credentialRule.Value()", value.credentialRule.Value(), 0U));
                VerifyOrReturn(CheckValueNull("credentials", value.credentials));
                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValue("creatorFabricIndex.Value()", value.creatorFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValue("lastModifiedFabricIndex.Value()", value.lastModifiedFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetUserResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValueNonNull("userName", value.userName));
                VerifyOrReturn(CheckValueAsString("userName.Value()", value.userName.Value(), chip::CharSpan("new_user", 8)));
                VerifyOrReturn(CheckValueNull("userUniqueId", value.userUniqueId));
                VerifyOrReturn(CheckValueNonNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValue("userStatus.Value()", value.userStatus.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("userType", value.userType));
                VerifyOrReturn(CheckValue("userType.Value()", value.userType.Value(), 0U));
                VerifyOrReturn(CheckValueNonNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValue("credentialRule.Value()", value.credentialRule.Value(), 0U));
                VerifyOrReturn(CheckValueNull("credentials", value.credentials));
                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValue("creatorFabricIndex.Value()", value.creatorFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValue("lastModifiedFabricIndex.Value()", value.lastModifiedFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetUserResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValueNonNull("userName", value.userName));
                VerifyOrReturn(CheckValueAsString("userName.Value()", value.userName.Value(), chip::CharSpan("new_user", 8)));
                VerifyOrReturn(CheckValueNonNull("userUniqueId", value.userUniqueId));
                VerifyOrReturn(CheckValue("userUniqueId.Value()", value.userUniqueId.Value(), 305441741UL));
                VerifyOrReturn(CheckValueNonNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValue("userStatus.Value()", value.userStatus.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("userType", value.userType));
                VerifyOrReturn(CheckValue("userType.Value()", value.userType.Value(), 0U));
                VerifyOrReturn(CheckValueNonNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValue("credentialRule.Value()", value.credentialRule.Value(), 0U));
                VerifyOrReturn(CheckValueNull("credentials", value.credentials));
                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValue("creatorFabricIndex.Value()", value.creatorFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValue("lastModifiedFabricIndex.Value()", value.lastModifiedFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetUserResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValueNonNull("userName", value.userName));
                VerifyOrReturn(CheckValueAsString("userName.Value()", value.userName.Value(), chip::CharSpan("new_user", 8)));
                VerifyOrReturn(CheckValueNonNull("userUniqueId", value.userUniqueId));
                VerifyOrReturn(CheckValue("userUniqueId.Value()", value.userUniqueId.Value(), 305441741UL));
                VerifyOrReturn(CheckValueNonNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValue("userStatus.Value()", value.userStatus.Value(), 3U));
                VerifyOrReturn(CheckValueNonNull("userType", value.userType));
                VerifyOrReturn(CheckValue("userType.Value()", value.userType.Value(), 0U));
                VerifyOrReturn(CheckValueNonNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValue("credentialRule.Value()", value.credentialRule.Value(), 0U));
                VerifyOrReturn(CheckValueNull("credentials", value.credentials));
                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValue("creatorFabricIndex.Value()", value.creatorFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValue("lastModifiedFabricIndex.Value()", value.lastModifiedFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetUserResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValueNonNull("userName", value.userName));
                VerifyOrReturn(CheckValueAsString("userName.Value()", value.userName.Value(), chip::CharSpan("new_user", 8)));
                VerifyOrReturn(CheckValueNonNull("userUniqueId", value.userUniqueId));
                VerifyOrReturn(CheckValue("userUniqueId.Value()", value.userUniqueId.Value(), 305441741UL));
                VerifyOrReturn(CheckValueNonNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValue("userStatus.Value()", value.userStatus.Value(), 3U));
                VerifyOrReturn(CheckValueNonNull("userType", value.userType));
                VerifyOrReturn(CheckValue("userType.Value()", value.userType.Value(), 6U));
                VerifyOrReturn(CheckValueNonNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValue("credentialRule.Value()", value.credentialRule.Value(), 0U));
                VerifyOrReturn(CheckValueNull("credentials", value.credentials));
                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValue("creatorFabricIndex.Value()", value.creatorFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValue("lastModifiedFabricIndex.Value()", value.lastModifiedFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetUserResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValueNonNull("userName", value.userName));
                VerifyOrReturn(CheckValueAsString("userName.Value()", value.userName.Value(), chip::CharSpan("new_user", 8)));
                VerifyOrReturn(CheckValueNonNull("userUniqueId", value.userUniqueId));
                VerifyOrReturn(CheckValue("userUniqueId.Value()", value.userUniqueId.Value(), 305441741UL));
                VerifyOrReturn(CheckValueNonNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValue("userStatus.Value()", value.userStatus.Value(), 3U));
                VerifyOrReturn(CheckValueNonNull("userType", value.userType));
                VerifyOrReturn(CheckValue("userType.Value()", value.userType.Value(), 6U));
                VerifyOrReturn(CheckValueNonNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValue("credentialRule.Value()", value.credentialRule.Value(), 2U));
                VerifyOrReturn(CheckValueNull("credentials", value.credentials));
                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValue("creatorFabricIndex.Value()", value.creatorFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValue("lastModifiedFabricIndex.Value()", value.lastModifiedFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetUserResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValueNonNull("userName", value.userName));
                VerifyOrReturn(CheckValueAsString("userName.Value()", value.userName.Value(), chip::CharSpan("test_user", 9)));
                VerifyOrReturn(CheckValueNonNull("userUniqueId", value.userUniqueId));
                VerifyOrReturn(CheckValue("userUniqueId.Value()", value.userUniqueId.Value(), 466460832UL));
                VerifyOrReturn(CheckValueNonNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValue("userStatus.Value()", value.userStatus.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("userType", value.userType));
                VerifyOrReturn(CheckValue("userType.Value()", value.userType.Value(), 0U));
                VerifyOrReturn(CheckValueNonNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValue("credentialRule.Value()", value.credentialRule.Value(), 1U));
                VerifyOrReturn(CheckValueNull("credentials", value.credentials));
                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValue("creatorFabricIndex.Value()", value.creatorFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValue("lastModifiedFabricIndex.Value()", value.lastModifiedFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetUserResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 2U));
                VerifyOrReturn(CheckValueNonNull("userName", value.userName));
                VerifyOrReturn(CheckValueAsString("userName.Value()", value.userName.Value(), chip::CharSpan("test_user2", 10)));
                VerifyOrReturn(CheckValueNonNull("userUniqueId", value.userUniqueId));
                VerifyOrReturn(CheckValue("userUniqueId.Value()", value.userUniqueId.Value(), 12648430UL));
                VerifyOrReturn(CheckValueNonNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValue("userStatus.Value()", value.userStatus.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("userType", value.userType));
                VerifyOrReturn(CheckValue("userType.Value()", value.userType.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValue("credentialRule.Value()", value.credentialRule.Value(), 2U));
                VerifyOrReturn(CheckValueNull("credentials", value.credentials));
                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValue("creatorFabricIndex.Value()", value.creatorFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValue("lastModifiedFabricIndex.Value()", value.lastModifiedFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetUserResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 3U));
                VerifyOrReturn(CheckValueNull("userName", value.userName));
                VerifyOrReturn(CheckValueNull("userUniqueId", value.userUniqueId));
                VerifyOrReturn(CheckValueNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValueNull("userType", value.userType));
                VerifyOrReturn(CheckValueNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValueNull("credentials", value.credentials));
                VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetUserResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 3U));
                VerifyOrReturn(CheckValueNull("userName", value.userName));
                VerifyOrReturn(CheckValueNull("userUniqueId", value.userUniqueId));
                VerifyOrReturn(CheckValueNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValueNull("userType", value.userType));
                VerifyOrReturn(CheckValueNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValueNull("credentials", value.credentials));
                VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetUserResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 3U));
                VerifyOrReturn(CheckValueNonNull("userName", value.userName));
                VerifyOrReturn(CheckValueAsString("userName.Value()", value.userName.Value(), chip::CharSpan("test_user3", 10)));
                VerifyOrReturn(CheckValueNonNull("userUniqueId", value.userUniqueId));
                VerifyOrReturn(CheckValue("userUniqueId.Value()", value.userUniqueId.Value(), 47802UL));
                VerifyOrReturn(CheckValueNonNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValue("userStatus.Value()", value.userStatus.Value(), 3U));
                VerifyOrReturn(CheckValueNonNull("userType", value.userType));
                VerifyOrReturn(CheckValue("userType.Value()", value.userType.Value(), 0U));
                VerifyOrReturn(CheckValueNonNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValue("credentialRule.Value()", value.credentialRule.Value(), 0U));
                VerifyOrReturn(CheckValueNull("credentials", value.credentials));
                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValue("creatorFabricIndex.Value()", value.creatorFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValue("lastModifiedFabricIndex.Value()", value.lastModifiedFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetUserResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, NumberOfTotalUsersSupported));
                VerifyOrReturn(CheckValueNonNull("userName", value.userName));
                VerifyOrReturn(CheckValueAsString("userName.Value()", value.userName.Value(), chip::CharSpan("last_user", 9)));
                VerifyOrReturn(CheckValueNull("userUniqueId", value.userUniqueId));
                VerifyOrReturn(CheckValueNonNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValue("userStatus.Value()", value.userStatus.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("userType", value.userType));
                VerifyOrReturn(CheckValue("userType.Value()", value.userType.Value(), 0U));
                VerifyOrReturn(CheckValueNonNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValue("credentialRule.Value()", value.credentialRule.Value(), 0U));
                VerifyOrReturn(CheckValueNull("credentials", value.credentials));
                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValue("creatorFabricIndex.Value()", value.creatorFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValue("lastModifiedFabricIndex.Value()", value.lastModifiedFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
            }
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetUserResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValueNull("userName", value.userName));
                VerifyOrReturn(CheckValueNull("userUniqueId", value.userUniqueId));
                VerifyOrReturn(CheckValueNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValueNull("userType", value.userType));
                VerifyOrReturn(CheckValueNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValueNull("credentials", value.credentials));
                VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValueNonNull("nextUserIndex", value.nextUserIndex));
                VerifyOrReturn(CheckValue("nextUserIndex.Value()", value.nextUserIndex.Value(), 2U));
            }
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetUserResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValueNonNull("userName", value.userName));
                VerifyOrReturn(CheckValueAsString("userName.Value()", value.userName.Value(), chip::CharSpan("", 0)));
                VerifyOrReturn(CheckValueNull("userUniqueId", value.userUniqueId));
                VerifyOrReturn(CheckValueNonNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValue("userStatus.Value()", value.userStatus.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("userType", value.userType));
                VerifyOrReturn(CheckValue("userType.Value()", value.userType.Value(), 0U));
                VerifyOrReturn(CheckValueNonNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValue("credentialRule.Value()", value.credentialRule.Value(), 0U));
                VerifyOrReturn(CheckValueNull("credentials", value.credentials));
                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValue("creatorFabricIndex.Value()", value.creatorFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValue("lastModifiedFabricIndex.Value()", value.lastModifiedFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("nextUserIndex", value.nextUserIndex));
                VerifyOrReturn(CheckValue("nextUserIndex.Value()", value.nextUserIndex.Value(), 2U));
            }
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetUserResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 2U));
                VerifyOrReturn(CheckValueNull("userName", value.userName));
                VerifyOrReturn(CheckValueNull("userUniqueId", value.userUniqueId));
                VerifyOrReturn(CheckValueNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValueNull("userType", value.userType));
                VerifyOrReturn(CheckValueNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValueNull("credentials", value.credentials));
                VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
            }
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetUserResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, NumberOfTotalUsersSupported));
                VerifyOrReturn(CheckValueNull("userName", value.userName));
                VerifyOrReturn(CheckValueNull("userUniqueId", value.userUniqueId));
                VerifyOrReturn(CheckValueNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValueNull("userType", value.userType));
                VerifyOrReturn(CheckValueNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValueNull("credentials", value.credentials));
                VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
            }
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("numberOfPINUsersSupported", value, 10U));
                NumberOfPINUsersSupported = value;
            }
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetCredentialStatusResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("credentialExists", value.credentialExists, false));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValueNull("nextCredentialIndex", value.nextCredentialIndex));
            }
            break;
        case 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetCredentialStatusResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("credentialExists", value.credentialExists, false));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValueNull("nextCredentialIndex", value.nextCredentialIndex));
            }
            break;
        case 44:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetCredentialStatusResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("credentialExists", value.credentialExists, false));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValueNull("nextCredentialIndex", value.nextCredentialIndex));
            }
            break;
        case 45:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 133U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 2U));
            }
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 133U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 2U));
            }
            break;
        case 47:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValueNonNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValue("userIndex.Value()", value.userIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 2U));
            }
            break;
        case 48:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetUserResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValueNonNull("userName", value.userName));
                VerifyOrReturn(CheckValueAsString("userName.Value()", value.userName.Value(), chip::CharSpan("", 0)));
                VerifyOrReturn(CheckValueNull("userUniqueId", value.userUniqueId));
                VerifyOrReturn(CheckValueNonNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValue("userStatus.Value()", value.userStatus.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("userType", value.userType));
                VerifyOrReturn(CheckValue("userType.Value()", value.userType.Value(), 0U));
                VerifyOrReturn(CheckValueNonNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValue("credentialRule.Value()", value.credentialRule.Value(), 0U));
                VerifyOrReturn(CheckValueNonNull("credentials", value.credentials));
                {
                    auto iter_1 = value.credentials.Value().begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 0));
                    VerifyOrReturn(CheckValue("credentials.Value()[0].credentialType", iter_1.GetValue().credentialType, 1U));
                    VerifyOrReturn(CheckValue("credentials.Value()[0].credentialIndex", iter_1.GetValue().credentialIndex, 1U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 1));
                }
                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValue("creatorFabricIndex.Value()", value.creatorFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValue("lastModifiedFabricIndex.Value()", value.lastModifiedFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
            }
            break;
        case 49:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetCredentialStatusResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("credentialExists", value.credentialExists, true));
                VerifyOrReturn(CheckValueNonNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValue("userIndex.Value()", value.userIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValue("creatorFabricIndex.Value()", value.creatorFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValue("lastModifiedFabricIndex.Value()", value.lastModifiedFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNull("nextCredentialIndex", value.nextCredentialIndex));
            }
            break;
        case 50:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 133U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 2U));
            }
            break;
        case 51:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 133U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNull("nextCredentialIndex", value.nextCredentialIndex));
            }
            break;
        case 52:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("numberOfRFIDUsersSupported", value, 10U));
                NumberOfRFIDUsersSupported = value;
            }
            break;
        case 53:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetCredentialStatusResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("credentialExists", value.credentialExists, false));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
            }
            break;
        case 54:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetCredentialStatusResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("credentialExists", value.credentialExists, false));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValueNull("nextCredentialIndex", value.nextCredentialIndex));
            }
            break;
        case 55:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetCredentialStatusResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("credentialExists", value.credentialExists, false));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValueNull("nextCredentialIndex", value.nextCredentialIndex));
            }
            break;
        case 56:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 3U));
            }
            break;
        case 57:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetUserResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValueNonNull("userName", value.userName));
                VerifyOrReturn(CheckValueAsString("userName.Value()", value.userName.Value(), chip::CharSpan("", 0)));
                VerifyOrReturn(CheckValueNull("userUniqueId", value.userUniqueId));
                VerifyOrReturn(CheckValueNonNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValue("userStatus.Value()", value.userStatus.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("userType", value.userType));
                VerifyOrReturn(CheckValue("userType.Value()", value.userType.Value(), 0U));
                VerifyOrReturn(CheckValueNonNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValue("credentialRule.Value()", value.credentialRule.Value(), 0U));
                VerifyOrReturn(CheckValueNonNull("credentials", value.credentials));
                {
                    auto iter_1 = value.credentials.Value().begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 0));
                    VerifyOrReturn(CheckValue("credentials.Value()[0].credentialType", iter_1.GetValue().credentialType, 1U));
                    VerifyOrReturn(CheckValue("credentials.Value()[0].credentialIndex", iter_1.GetValue().credentialIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 1));
                    VerifyOrReturn(CheckValue("credentials.Value()[1].credentialType", iter_1.GetValue().credentialType, 2U));
                    VerifyOrReturn(CheckValue("credentials.Value()[1].credentialIndex", iter_1.GetValue().credentialIndex, 2U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 2));
                }
                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValue("creatorFabricIndex.Value()", value.creatorFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValue("lastModifiedFabricIndex.Value()", value.lastModifiedFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
            }
            break;
        case 58:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetCredentialStatusResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("credentialExists", value.credentialExists, true));
                VerifyOrReturn(CheckValueNonNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValue("userIndex.Value()", value.userIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValue("creatorFabricIndex.Value()", value.creatorFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValue("lastModifiedFabricIndex.Value()", value.lastModifiedFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNull("nextCredentialIndex", value.nextCredentialIndex));
            }
            break;
        case 59:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 133U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 3U));
            }
            break;
        case 60:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 133U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNull("nextCredentialIndex", value.nextCredentialIndex));
            }
            break;
        case 61:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 133U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 4U));
            }
            break;
        case 62:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 133U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 4U));
            }
            break;
        case 63:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 133U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 4U));
            }
            break;
        case 64:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 133U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 4U));
            }
            break;
        case 65:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 133U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 4U));
            }
            break;
        case 66:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 133U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 4U));
            }
            break;
        case 67:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 133U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 4U));
            }
            break;
        case 68:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 2U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 5U));
            }
            break;
        case 69:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 2U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 5U));
            }
            break;
        case 70:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 3U));
            }
            break;
        case 71:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValueNonNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValue("userIndex.Value()", value.userIndex.Value(), 2U));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 4U));
            }
            break;
        case 72:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 2U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 5U));
            }
            break;
        case 73:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 5U));
            }
            break;
        case 74:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetUserResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValueNonNull("userName", value.userName));
                VerifyOrReturn(CheckValueAsString("userName.Value()", value.userName.Value(), chip::CharSpan("", 0)));
                VerifyOrReturn(CheckValueNull("userUniqueId", value.userUniqueId));
                VerifyOrReturn(CheckValueNonNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValue("userStatus.Value()", value.userStatus.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("userType", value.userType));
                VerifyOrReturn(CheckValue("userType.Value()", value.userType.Value(), 0U));
                VerifyOrReturn(CheckValueNonNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValue("credentialRule.Value()", value.credentialRule.Value(), 0U));
                VerifyOrReturn(CheckValueNonNull("credentials", value.credentials));
                {
                    auto iter_1 = value.credentials.Value().begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 0));
                    VerifyOrReturn(CheckValue("credentials.Value()[0].credentialType", iter_1.GetValue().credentialType, 1U));
                    VerifyOrReturn(CheckValue("credentials.Value()[0].credentialIndex", iter_1.GetValue().credentialIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 1));
                    VerifyOrReturn(CheckValue("credentials.Value()[1].credentialType", iter_1.GetValue().credentialType, 2U));
                    VerifyOrReturn(CheckValue("credentials.Value()[1].credentialIndex", iter_1.GetValue().credentialIndex, 2U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 2));
                    VerifyOrReturn(CheckValue("credentials.Value()[2].credentialType", iter_1.GetValue().credentialType, 2U));
                    VerifyOrReturn(CheckValue("credentials.Value()[2].credentialIndex", iter_1.GetValue().credentialIndex, 4U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 3));
                }
                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValue("creatorFabricIndex.Value()", value.creatorFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValue("lastModifiedFabricIndex.Value()", value.lastModifiedFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("nextUserIndex", value.nextUserIndex));
                VerifyOrReturn(CheckValue("nextUserIndex.Value()", value.nextUserIndex.Value(), 2U));
            }
            break;
        case 75:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 6U));
            }
            break;
        case 76:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetUserResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValueNonNull("userName", value.userName));
                VerifyOrReturn(CheckValueAsString("userName.Value()", value.userName.Value(), chip::CharSpan("", 0)));
                VerifyOrReturn(CheckValueNull("userUniqueId", value.userUniqueId));
                VerifyOrReturn(CheckValueNonNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValue("userStatus.Value()", value.userStatus.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("userType", value.userType));
                VerifyOrReturn(CheckValue("userType.Value()", value.userType.Value(), 0U));
                VerifyOrReturn(CheckValueNonNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValue("credentialRule.Value()", value.credentialRule.Value(), 0U));
                VerifyOrReturn(CheckValueNonNull("credentials", value.credentials));
                {
                    auto iter_1 = value.credentials.Value().begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 0));
                    VerifyOrReturn(CheckValue("credentials.Value()[0].credentialType", iter_1.GetValue().credentialType, 1U));
                    VerifyOrReturn(CheckValue("credentials.Value()[0].credentialIndex", iter_1.GetValue().credentialIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 1));
                    VerifyOrReturn(CheckValue("credentials.Value()[1].credentialType", iter_1.GetValue().credentialType, 2U));
                    VerifyOrReturn(CheckValue("credentials.Value()[1].credentialIndex", iter_1.GetValue().credentialIndex, 2U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 2));
                    VerifyOrReturn(CheckValue("credentials.Value()[2].credentialType", iter_1.GetValue().credentialType, 2U));
                    VerifyOrReturn(CheckValue("credentials.Value()[2].credentialIndex", iter_1.GetValue().credentialIndex, 4U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 3));
                    VerifyOrReturn(CheckValue("credentials.Value()[3].credentialType", iter_1.GetValue().credentialType, 1U));
                    VerifyOrReturn(CheckValue("credentials.Value()[3].credentialIndex", iter_1.GetValue().credentialIndex, 5U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 4));
                }
                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValue("creatorFabricIndex.Value()", value.creatorFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValue("lastModifiedFabricIndex.Value()", value.lastModifiedFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("nextUserIndex", value.nextUserIndex));
                VerifyOrReturn(CheckValue("nextUserIndex.Value()", value.nextUserIndex.Value(), 2U));
            }
            break;
        case 77:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 78:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetCredentialStatusResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("credentialExists", value.credentialExists, false));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 2U));
            }
            break;
        case 79:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetUserResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValueNonNull("userName", value.userName));
                VerifyOrReturn(CheckValueAsString("userName.Value()", value.userName.Value(), chip::CharSpan("", 0)));
                VerifyOrReturn(CheckValueNull("userUniqueId", value.userUniqueId));
                VerifyOrReturn(CheckValueNonNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValue("userStatus.Value()", value.userStatus.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("userType", value.userType));
                VerifyOrReturn(CheckValue("userType.Value()", value.userType.Value(), 0U));
                VerifyOrReturn(CheckValueNonNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValue("credentialRule.Value()", value.credentialRule.Value(), 0U));
                VerifyOrReturn(CheckValueNonNull("credentials", value.credentials));
                {
                    auto iter_1 = value.credentials.Value().begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 0));
                    VerifyOrReturn(CheckValue("credentials.Value()[0].credentialType", iter_1.GetValue().credentialType, 2U));
                    VerifyOrReturn(CheckValue("credentials.Value()[0].credentialIndex", iter_1.GetValue().credentialIndex, 2U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 1));
                    VerifyOrReturn(CheckValue("credentials.Value()[1].credentialType", iter_1.GetValue().credentialType, 2U));
                    VerifyOrReturn(CheckValue("credentials.Value()[1].credentialIndex", iter_1.GetValue().credentialIndex, 4U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 2));
                    VerifyOrReturn(CheckValue("credentials.Value()[2].credentialType", iter_1.GetValue().credentialType, 1U));
                    VerifyOrReturn(CheckValue("credentials.Value()[2].credentialIndex", iter_1.GetValue().credentialIndex, 5U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 3));
                }
                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValue("creatorFabricIndex.Value()", value.creatorFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValue("lastModifiedFabricIndex.Value()", value.lastModifiedFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("nextUserIndex", value.nextUserIndex));
                VerifyOrReturn(CheckValue("nextUserIndex.Value()", value.nextUserIndex.Value(), 2U));
            }
            break;
        case 80:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 81:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetCredentialStatusResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("credentialExists", value.credentialExists, false));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 4U));
            }
            break;
        case 82:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetUserResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 2U));
                VerifyOrReturn(CheckValueNull("userName", value.userName));
                VerifyOrReturn(CheckValueNull("userUniqueId", value.userUniqueId));
                VerifyOrReturn(CheckValueNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValueNull("userType", value.userType));
                VerifyOrReturn(CheckValueNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValueNull("credentials", value.credentials));
                VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
            }
            break;
        case 83:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValueNonNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValue("userIndex.Value()", value.userIndex.Value(), 2U));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 3U));
            }
            break;
        case 84:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 85:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetCredentialStatusResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("credentialExists", value.credentialExists, false));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 5U));
            }
            break;
        case 86:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetCredentialStatusResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("credentialExists", value.credentialExists, false));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 5U));
            }
            break;
        case 87:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetCredentialStatusResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("credentialExists", value.credentialExists, false));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 5U));
            }
            break;
        case 88:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetUserResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValueNonNull("userName", value.userName));
                VerifyOrReturn(CheckValueAsString("userName.Value()", value.userName.Value(), chip::CharSpan("", 0)));
                VerifyOrReturn(CheckValueNull("userUniqueId", value.userUniqueId));
                VerifyOrReturn(CheckValueNonNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValue("userStatus.Value()", value.userStatus.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("userType", value.userType));
                VerifyOrReturn(CheckValue("userType.Value()", value.userType.Value(), 0U));
                VerifyOrReturn(CheckValueNonNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValue("credentialRule.Value()", value.credentialRule.Value(), 0U));
                VerifyOrReturn(CheckValueNonNull("credentials", value.credentials));
                {
                    auto iter_1 = value.credentials.Value().begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 0));
                    VerifyOrReturn(CheckValue("credentials.Value()[0].credentialType", iter_1.GetValue().credentialType, 1U));
                    VerifyOrReturn(CheckValue("credentials.Value()[0].credentialIndex", iter_1.GetValue().credentialIndex, 5U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 1));
                }
                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValue("creatorFabricIndex.Value()", value.creatorFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValue("lastModifiedFabricIndex.Value()", value.lastModifiedFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
            }
            break;
        case 89:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetUserResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 2U));
                VerifyOrReturn(CheckValueNull("userName", value.userName));
                VerifyOrReturn(CheckValueNull("userUniqueId", value.userUniqueId));
                VerifyOrReturn(CheckValueNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValueNull("userType", value.userType));
                VerifyOrReturn(CheckValueNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValueNull("credentials", value.credentials));
                VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
            }
            break;
        case 90:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValueNonNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValue("userIndex.Value()", value.userIndex.Value(), 2U));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 2U));
            }
            break;
        case 91:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValueNonNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValue("userIndex.Value()", value.userIndex.Value(), 3U));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 3U));
            }
            break;
        case 92:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValueNonNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValue("userIndex.Value()", value.userIndex.Value(), 4U));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 7U));
            }
            break;
        case 93:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 94:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetCredentialStatusResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("credentialExists", value.credentialExists, false));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValueNull("nextCredentialIndex", value.nextCredentialIndex));
            }
            break;
        case 95:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetCredentialStatusResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("credentialExists", value.credentialExists, false));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValueNull("nextCredentialIndex", value.nextCredentialIndex));
            }
            break;
        case 96:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetCredentialStatusResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("credentialExists", value.credentialExists, false));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValueNull("nextCredentialIndex", value.nextCredentialIndex));
            }
            break;
        case 97:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetUserResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValueNull("userName", value.userName));
                VerifyOrReturn(CheckValueNull("userUniqueId", value.userUniqueId));
                VerifyOrReturn(CheckValueNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValueNull("userType", value.userType));
                VerifyOrReturn(CheckValueNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValueNull("credentials", value.credentials));
                VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
            }
            break;
        case 98:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetUserResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 2U));
                VerifyOrReturn(CheckValueNull("userName", value.userName));
                VerifyOrReturn(CheckValueNull("userUniqueId", value.userUniqueId));
                VerifyOrReturn(CheckValueNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValueNull("userType", value.userType));
                VerifyOrReturn(CheckValueNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValueNull("credentials", value.credentials));
                VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
            }
            break;
        case 99:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetUserResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 3U));
                VerifyOrReturn(CheckValueNull("userName", value.userName));
                VerifyOrReturn(CheckValueNull("userUniqueId", value.userUniqueId));
                VerifyOrReturn(CheckValueNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValueNull("userType", value.userType));
                VerifyOrReturn(CheckValueNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValueNull("credentials", value.credentials));
                VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
            }
            break;
        case 100:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetUserResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 4U));
                VerifyOrReturn(CheckValueNull("userName", value.userName));
                VerifyOrReturn(CheckValueNull("userUniqueId", value.userUniqueId));
                VerifyOrReturn(CheckValueNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValueNull("userType", value.userType));
                VerifyOrReturn(CheckValueNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValueNull("credentials", value.credentials));
                VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
            }
            break;
        case 101:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 133U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNull("nextCredentialIndex", value.nextCredentialIndex));
            }
            break;
        case 102:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValueNonNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValue("userIndex.Value()", value.userIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNull("nextCredentialIndex", value.nextCredentialIndex));
            }
            break;
        case 103:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetUserResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValueNonNull("userName", value.userName));
                VerifyOrReturn(CheckValueAsString("userName.Value()", value.userName.Value(), chip::CharSpan("", 0)));
                VerifyOrReturn(CheckValueNull("userUniqueId", value.userUniqueId));
                VerifyOrReturn(CheckValueNonNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValue("userStatus.Value()", value.userStatus.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("userType", value.userType));
                VerifyOrReturn(CheckValue("userType.Value()", value.userType.Value(), 0U));
                VerifyOrReturn(CheckValueNonNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValue("credentialRule.Value()", value.credentialRule.Value(), 0U));
                VerifyOrReturn(CheckValueNonNull("credentials", value.credentials));
                {
                    auto iter_1 = value.credentials.Value().begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 0));
                    VerifyOrReturn(CheckValue("credentials.Value()[0].credentialType", iter_1.GetValue().credentialType, 0U));
                    VerifyOrReturn(CheckValue("credentials.Value()[0].credentialIndex", iter_1.GetValue().credentialIndex, 0U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 1));
                }
                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValue("creatorFabricIndex.Value()", value.creatorFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValue("lastModifiedFabricIndex.Value()", value.lastModifiedFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
            }
            break;
        case 104:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetCredentialStatusResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("credentialExists", value.credentialExists, true));
                VerifyOrReturn(CheckValueNonNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValue("userIndex.Value()", value.userIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValue("creatorFabricIndex.Value()", value.creatorFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValue("lastModifiedFabricIndex.Value()", value.lastModifiedFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNull("nextCredentialIndex", value.nextCredentialIndex));
            }
            break;
        case 105:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNull("nextCredentialIndex", value.nextCredentialIndex));
            }
            break;
        case 106:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 107:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 108:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 109:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 110:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 111:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 112:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 113:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetUserResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValueNull("userName", value.userName));
                VerifyOrReturn(CheckValueNull("userUniqueId", value.userUniqueId));
                VerifyOrReturn(CheckValueNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValueNull("userType", value.userType));
                VerifyOrReturn(CheckValueNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValueNull("credentials", value.credentials));
                VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
            }
            break;
        case 114:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetCredentialStatusResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("credentialExists", value.credentialExists, false));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValueNull("nextCredentialIndex", value.nextCredentialIndex));
            }
            break;
        case 115:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValueNonNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValue("userIndex.Value()", value.userIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 2U));
            }
            break;
        case 116:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 3U));
            }
            break;
        case 117:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 4U));
            }
            break;
        case 118:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 5U));
            }
            break;
        case 119:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 6U));
            }
            break;
        case 120:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 137U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 7U));
            }
            break;
        case 121:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read available user slot and verify response fields");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Get number of supported users and verify default value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                 DoorLock::Attributes::NumberOfTotalUsersSupported::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read fails for user with index 0");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Read fails for user with index greater than Number Of Users Supported");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = static_cast<uint16_t>(NumberOfTotalUsersSupported + 1);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "Create new user with default parameters");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetUser::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);
            value.userIndex     = 1U;
            value.userName.SetNull();
            value.userUniqueId.SetNull();
            value.userStatus.SetNull();
            value.userType.SetNull();
            value.credentialRule.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Read the user back and verify its fields");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "Set user at the occupied index fails with appropriate response");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetUser::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);
            value.userIndex     = 1U;
            value.userName.SetNull();
            value.userUniqueId.SetNull();
            value.userStatus.SetNull();
            value.userType.SetNull();
            value.credentialRule.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "Modify userName for existing user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetUser::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(2);
            value.userIndex     = 1U;
            value.userName.SetNonNull();
            value.userName.Value() = chip::Span<const char>("new_usergarbage: not in length on purpose", 8);
            value.userUniqueId.SetNull();
            value.userStatus.SetNull();
            value.userType.SetNull();
            value.credentialRule.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "Read the modified user back and verify its fields");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 10: {
            LogStep(10, "Modify userUniqueId for existing user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetUser::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(2);
            value.userIndex     = 1U;
            value.userName.SetNull();
            value.userUniqueId.SetNonNull();
            value.userUniqueId.Value() = 305441741UL;
            value.userStatus.SetNull();
            value.userType.SetNull();
            value.credentialRule.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 11: {
            LogStep(11, "Read the modified user back and verify its fields");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "Modify userStatus for existing user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetUser::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(2);
            value.userIndex     = 1U;
            value.userName.SetNull();
            value.userUniqueId.SetNull();
            value.userStatus.SetNonNull();
            value.userStatus.Value() = static_cast<chip::app::Clusters::DoorLock::DlUserStatus>(3);
            value.userType.SetNull();
            value.credentialRule.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 13: {
            LogStep(13, "Read the modified user back and verify its fields");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "Modify userType for existing user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetUser::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(2);
            value.userIndex     = 1U;
            value.userName.SetNull();
            value.userUniqueId.SetNull();
            value.userStatus.SetNull();
            value.userType.SetNonNull();
            value.userType.Value() = static_cast<chip::app::Clusters::DoorLock::DlUserType>(6);
            value.credentialRule.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 15: {
            LogStep(15, "Read the modified user back and verify its fields");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 16: {
            LogStep(16, "Modify credentialRule for existing user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetUser::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(2);
            value.userIndex     = 1U;
            value.userName.SetNull();
            value.userUniqueId.SetNull();
            value.userStatus.SetNull();
            value.userType.SetNull();
            value.credentialRule.SetNonNull();
            value.credentialRule.Value() = static_cast<chip::app::Clusters::DoorLock::DlCredentialRule>(2);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 17: {
            LogStep(17, "Read the modified user back and verify its fields");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 18: {
            LogStep(18, "Modify all fields for existing user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetUser::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(2);
            value.userIndex     = 1U;
            value.userName.SetNonNull();
            value.userName.Value() = chip::Span<const char>("test_usergarbage: not in length on purpose", 9);
            value.userUniqueId.SetNonNull();
            value.userUniqueId.Value() = 466460832UL;
            value.userStatus.SetNonNull();
            value.userStatus.Value() = static_cast<chip::app::Clusters::DoorLock::DlUserStatus>(1);
            value.userType.SetNonNull();
            value.userType.Value() = static_cast<chip::app::Clusters::DoorLock::DlUserType>(0);
            value.credentialRule.SetNonNull();
            value.credentialRule.Value() = static_cast<chip::app::Clusters::DoorLock::DlCredentialRule>(1);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 19: {
            LogStep(19, "Read the modified user back and verify its fields");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 20: {
            LogStep(20, "Add another user with non-default fields");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetUser::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);
            value.userIndex     = 2U;
            value.userName.SetNonNull();
            value.userName.Value() = chip::Span<const char>("test_user2garbage: not in length on purpose", 10);
            value.userUniqueId.SetNonNull();
            value.userUniqueId.Value() = 12648430UL;
            value.userStatus.SetNonNull();
            value.userStatus.Value() = static_cast<chip::app::Clusters::DoorLock::DlUserStatus>(1);
            value.userType.SetNonNull();
            value.userType.Value() = static_cast<chip::app::Clusters::DoorLock::DlUserType>(1);
            value.credentialRule.SetNonNull();
            value.credentialRule.Value() = static_cast<chip::app::Clusters::DoorLock::DlCredentialRule>(2);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 21: {
            LogStep(21, "Read the new user back and verify its fields");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 2U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 22: {
            LogStep(22, "Try to add a user with userStatus 0");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetUser::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);
            value.userIndex     = 3U;
            value.userName.SetNonNull();
            value.userName.Value() = chip::Span<const char>("test_user3garbage: not in length on purpose", 10);
            value.userUniqueId.SetNonNull();
            value.userUniqueId.Value() = 47802UL;
            value.userStatus.SetNonNull();
            value.userStatus.Value() = static_cast<chip::app::Clusters::DoorLock::DlUserStatus>(0);
            value.userType.SetNull();
            value.credentialRule.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 23: {
            LogStep(23, "Make sure the user did not get created");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 3U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 24: {
            LogStep(24, "Try to add a user with userStatus 2");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetUser::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);
            value.userIndex     = 3U;
            value.userName.SetNonNull();
            value.userName.Value() = chip::Span<const char>("test_user3garbage: not in length on purpose", 10);
            value.userUniqueId.SetNonNull();
            value.userUniqueId.Value() = 47802UL;
            value.userStatus.SetNonNull();
            value.userStatus.Value() = static_cast<chip::app::Clusters::DoorLock::DlUserStatus>(2);
            value.userType.SetNull();
            value.credentialRule.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 25: {
            LogStep(25, "Make sure the user did not get created");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 3U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 26: {
            LogStep(26, "Try to add a user with userStatus 3");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetUser::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);
            value.userIndex     = 3U;
            value.userName.SetNonNull();
            value.userName.Value() = chip::Span<const char>("test_user3garbage: not in length on purpose", 10);
            value.userUniqueId.SetNonNull();
            value.userUniqueId.Value() = 47802UL;
            value.userStatus.SetNonNull();
            value.userStatus.Value() = static_cast<chip::app::Clusters::DoorLock::DlUserStatus>(3);
            value.userType.SetNull();
            value.credentialRule.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 27: {
            LogStep(27, "Read the new third user back and verify its fields");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 3U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 28: {
            LogStep(28, "Create user in the last slot");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetUser::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);
            value.userIndex     = NumberOfTotalUsersSupported;
            value.userName.SetNonNull();
            value.userName.Value() = chip::Span<const char>("last_usergarbage: not in length on purpose", 9);
            value.userUniqueId.SetNull();
            value.userStatus.SetNull();
            value.userType.SetNull();
            value.credentialRule.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 29: {
            LogStep(29, "Read the last user back and verify its fields");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = NumberOfTotalUsersSupported;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 30: {
            LogStep(30, "User creation in the 0 slot fails");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetUser::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);
            value.userIndex     = 0U;
            value.userName.SetNull();
            value.userUniqueId.SetNull();
            value.userStatus.SetNull();
            value.userType.SetNull();
            value.credentialRule.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 31: {
            LogStep(31, "User creation in the out-of-bounds slot fails");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetUser::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);
            value.userIndex     = static_cast<uint16_t>(NumberOfTotalUsersSupported + 1);
            value.userName.SetNull();
            value.userUniqueId.SetNull();
            value.userStatus.SetNull();
            value.userType.SetNull();
            value.credentialRule.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 32: {
            LogStep(32, "Clear first user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearUser::Type value;
            value.userIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 33: {
            LogStep(33, "Read cleared user and verify it is available");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 34: {
            LogStep(34, "Create new user in the cleared slot");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetUser::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);
            value.userIndex     = 1U;
            value.userName.SetNull();
            value.userUniqueId.SetNull();
            value.userStatus.SetNull();
            value.userType.SetNull();
            value.credentialRule.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 35: {
            LogStep(35, "Read the user in the previously cleared slot and verify its fields");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 36: {
            LogStep(36, "Clear user with index 0 fails");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearUser::Type value;
            value.userIndex = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 37: {
            LogStep(37, "Clear user with out-of-bounds index fails");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearUser::Type value;
            value.userIndex = static_cast<uint16_t>(NumberOfTotalUsersSupported + 1);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 38: {
            LogStep(38, "Clear all users");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearUser::Type value;
            value.userIndex = 65534U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 39: {
            LogStep(39, "Read first cleared user and verify it is available");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 2U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 40: {
            LogStep(40, "Read last cleared user and verify it is available");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = NumberOfTotalUsersSupported;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 41: {
            LogStep(41, "Get number of supported PIN credentials and verify default value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::NumberOfPINUsersSupported::Id,
                                 true, chip::NullOptional);
        }
        case 42: {
            LogStep(42, "Check that PIN credential does not exist");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 1U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
                               chip::NullOptional

            );
        }
        case 43: {
            LogStep(43, "Reading PIN credential with index 0 returns no credential");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 0U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
                               chip::NullOptional

            );
        }
        case 44: {
            LogStep(44, "Reading PIN credential with out-of-bounds index returns no credential");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = static_cast<uint16_t>(NumberOfPINUsersSupported + 1);

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
                               chip::NullOptional

            );
        }
        case 45: {
            LogStep(45, "Verify that a user with UserStatus = 0 cannot be added via SetCredential");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 1U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("000000garbage: not in length on purpose"), 6);
            value.userIndex.SetNull();
            value.userStatus.SetNonNull();
            value.userStatus.Value() = static_cast<chip::app::Clusters::DoorLock::DlUserStatus>(0);
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 46: {
            LogStep(46, "Verify that a user with UserStatus = 2 cannot be added via SetCredential");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 1U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("000000garbage: not in length on purpose"), 6);
            value.userIndex.SetNull();
            value.userStatus.SetNonNull();
            value.userStatus.Value() = static_cast<chip::app::Clusters::DoorLock::DlUserStatus>(2);
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 47: {
            LogStep(47, "Create new PIN credential and user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 1U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("000000garbage: not in length on purpose"), 6);
            value.userIndex.SetNull();
            value.userStatus.SetNull();
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 48: {
            LogStep(48, "Verify created user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 49: {
            LogStep(49, "Verify created PIN credential");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 1U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
                               chip::NullOptional

            );
        }
        case 50: {
            LogStep(50, "Create new PIN credential and user with index 0 fails");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 0U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("123456garbage: not in length on purpose"), 6);
            value.userIndex.SetNull();
            value.userStatus.SetNull();
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 51: {
            LogStep(51, "Create new PIN credential and user with out-of-bounds index fails");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = static_cast<uint16_t>(NumberOfPINUsersSupported + 1);

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("123456garbage: not in length on purpose"), 6);
            value.userIndex.SetNull();
            value.userStatus.SetNull();
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 52: {
            LogStep(52, "Get number of supported RFID credentials and verify default value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::NumberOfRFIDUsersSupported::Id,
                                 true, chip::NullOptional);
        }
        case 53: {
            LogStep(53, "Reading RFID credential with index 0 returns no credential duplicate with bug workaround");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(2);
            value.credential.credentialIndex = 0U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
                               chip::NullOptional

            );
        }
        case 54: {
            LogStep(54, "Reading RFID credential with out-of-bounds index returns no credential");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(2);
            value.credential.credentialIndex = static_cast<uint16_t>(NumberOfRFIDUsersSupported + 1);

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
                               chip::NullOptional

            );
        }
        case 55: {
            LogStep(55, "Check that RFID credential does not exist");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(2);
            value.credential.credentialIndex = 2U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
                               chip::NullOptional

            );
        }
        case 56: {
            LogStep(56, "Create new RFID credential and add it to existing user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(2);
            value.credential.credentialIndex = 2U;

            value.credentialData =
                chip::ByteSpan(chip::Uint8::from_const_char("rfid_data_123456garbage: not in length on purpose"), 16);
            value.userIndex.SetNonNull();
            value.userIndex.Value() = 1U;
            value.userStatus.SetNull();
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 57: {
            LogStep(57, "Verify modified user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 58: {
            LogStep(58, "Verify created credential");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(2);
            value.credential.credentialIndex = 2U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
                               chip::NullOptional

            );
        }
        case 59: {
            LogStep(59, "Create new RFID credential and user with index 0 fails");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(2);
            value.credential.credentialIndex = 0U;

            value.credentialData =
                chip::ByteSpan(chip::Uint8::from_const_char("new_rfid_data_fieldgarbage: not in length on purpose"), 19);
            value.userIndex.SetNull();
            value.userStatus.SetNull();
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 60: {
            LogStep(60, "Create new RFID credential and user with out-of-bounds index fails");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(2);
            value.credential.credentialIndex = static_cast<uint16_t>(NumberOfRFIDUsersSupported + 1);

            value.credentialData =
                chip::ByteSpan(chip::Uint8::from_const_char("new_rfid_data_fieldgarbage: not in length on purpose"), 19);
            value.userIndex.SetNull();
            value.userStatus.SetNull();
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 61: {
            LogStep(61, "Create new credential and try to add it to 0 user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 3U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("123465garbage: not in length on purpose"), 6);
            value.userIndex.SetNonNull();
            value.userIndex.Value() = 0U;
            value.userStatus.SetNull();
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 62: {
            LogStep(62, "Create new credential and try to add it to out-of-bounds user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 3U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("123465garbage: not in length on purpose"), 6);
            value.userIndex.SetNonNull();
            value.userIndex.Value() = static_cast<uint16_t>(NumberOfTotalUsersSupported + 1);
            value.userStatus.SetNull();
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 63: {
            LogStep(63, "Create new PIN with too short data");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 3U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("12345garbage: not in length on purpose"), 5);
            value.userIndex.SetNonNull();
            value.userIndex.Value() = 0U;
            value.userStatus.SetNull();
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 64: {
            LogStep(64, "Create new PIN with too long data");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 3U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("123456789garbage: not in length on purpose"), 9);
            value.userIndex.SetNonNull();
            value.userIndex.Value() = 0U;
            value.userStatus.SetNull();
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 65: {
            LogStep(65, "Create new RFID with too short data");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(2);
            value.credential.credentialIndex = 3U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("rfid_datagarbage: not in length on purpose"), 9);
            value.userIndex.SetNonNull();
            value.userIndex.Value() = 0U;
            value.userStatus.SetNull();
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 66: {
            LogStep(66, "Create new PIN with Programming user type fails");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 3U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("123456garbage: not in length on purpose"), 6);
            value.userIndex.SetNonNull();
            value.userIndex.Value() = 0U;
            value.userStatus.SetNull();
            value.userType.SetNonNull();
            value.userType.Value() = static_cast<chip::app::Clusters::DoorLock::DlUserType>(3);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 67: {
            LogStep(67, "Create new RFID with too short data");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(2);
            value.credential.credentialIndex = 3U;

            value.credentialData = chip::ByteSpan(
                chip::Uint8::from_const_char("very_long_rfid_data_to_test_boundariesgarbage: not in length on purpose"), 38);
            value.userIndex.SetNonNull();
            value.userIndex.Value() = 0U;
            value.userStatus.SetNull();
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 68: {
            LogStep(68, "Create new PIN credential with data the would cause duplicate");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 4U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("000000garbage: not in length on purpose"), 6);
            value.userIndex.SetNull();
            value.userStatus.SetNull();
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 69: {
            LogStep(69, "Create new RFID credential with data the would cause duplicate");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(2);
            value.credential.credentialIndex = 4U;

            value.credentialData =
                chip::ByteSpan(chip::Uint8::from_const_char("rfid_data_123456garbage: not in length on purpose"), 16);
            value.userIndex.SetNull();
            value.userStatus.SetNull();
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 70: {
            LogStep(70, "Modify credentialData of existing PIN credential");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(2);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 1U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("123456garbage: not in length on purpose"), 6);
            value.userIndex.SetNonNull();
            value.userIndex.Value() = 1U;
            value.userStatus.SetNull();
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 71: {
            LogStep(71, "Verify that credential was changed by creating new credential with old data");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 3U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("000000garbage: not in length on purpose"), 6);
            value.userIndex.SetNull();
            value.userStatus.SetNull();
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 72: {
            LogStep(72, "Verify that credential was changed by creating new credential with new data");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 4U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("123456garbage: not in length on purpose"), 6);
            value.userIndex.SetNull();
            value.userStatus.SetNull();
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 73: {
            LogStep(73, "Create new RFID credential and add it to existing user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(2);
            value.credential.credentialIndex = 4U;

            value.credentialData =
                chip::ByteSpan(chip::Uint8::from_const_char("rfid_data_7890garbage: not in length on purpose"), 14);
            value.userIndex.SetNonNull();
            value.userIndex.Value() = 1U;
            value.userStatus.SetNull();
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 74: {
            LogStep(74, "Verify modified user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 75: {
            LogStep(75, "Create new RFID credential and add it to existing user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 5U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("789012garbage: not in length on purpose"), 6);
            value.userIndex.SetNonNull();
            value.userIndex.Value() = 1U;
            value.userStatus.SetNull();
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 76: {
            LogStep(76, "Verify modified user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 77: {
            LogStep(77, "Clear first PIN credential");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearCredential::Type value;
            value.credential.SetNonNull();

            value.credential.Value().credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.Value().credentialIndex = 1U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 78: {
            LogStep(78, "Read back the credential and make sure it is deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 1U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
                               chip::NullOptional

            );
        }
        case 79: {
            LogStep(79, "Read the user back and make sure PIN credential is deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 80: {
            LogStep(80, "Clear the second PIN credential");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearCredential::Type value;
            value.credential.SetNonNull();

            value.credential.Value().credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.Value().credentialIndex = 3U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 81: {
            LogStep(81, "Read back the credential and make sure it is deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 3U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
                               chip::NullOptional

            );
        }
        case 82: {
            LogStep(82, "Read the user back and make sure related user is deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 2U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 83: {
            LogStep(83, "Create new RFID credential with user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(2);
            value.credential.credentialIndex = 1U;

            value.credentialData =
                chip::ByteSpan(chip::Uint8::from_const_char("rfid_data_12345garbage: not in length on purpose"), 15);
            value.userIndex.SetNull();
            value.userStatus.SetNull();
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 84: {
            LogStep(84, "Clear all the RFID credentials");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearCredential::Type value;
            value.credential.SetNonNull();

            value.credential.Value().credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(2);
            value.credential.Value().credentialIndex = 65534U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 85: {
            LogStep(85, "Read back the fist RFID credential and make sure it is deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(2);
            value.credential.credentialIndex = 1U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
                               chip::NullOptional

            );
        }
        case 86: {
            LogStep(86, "Read back the second RFID credential and make sure it is deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(2);
            value.credential.credentialIndex = 2U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
                               chip::NullOptional

            );
        }
        case 87: {
            LogStep(87, "Read back the third RFID credential and make sure it is deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(2);
            value.credential.credentialIndex = 4U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
                               chip::NullOptional

            );
        }
        case 88: {
            LogStep(88, "Read the user related with first RFID back and make sure it has only PIN credential");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 89: {
            LogStep(89, "Read the user related with second RFID back and make sure it is deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 2U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 90: {
            LogStep(90, "Create new PIN credential with user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 1U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("123456garbage: not in length on purpose"), 6);
            value.userIndex.SetNull();
            value.userStatus.SetNull();
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 91: {
            LogStep(91, "Create new RFID credential with user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(2);
            value.credential.credentialIndex = 2U;

            value.credentialData =
                chip::ByteSpan(chip::Uint8::from_const_char("rfid_data_1234garbage: not in length on purpose"), 14);
            value.userIndex.SetNull();
            value.userStatus.SetNull();
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 92: {
            LogStep(92, "Create another RFID credential with user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(2);
            value.credential.credentialIndex = 6U;

            value.credentialData =
                chip::ByteSpan(chip::Uint8::from_const_char("rfid_data_9876garbage: not in length on purpose"), 14);
            value.userIndex.SetNull();
            value.userStatus.SetNull();
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 93: {
            LogStep(93, "Clear all the credentials");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearCredential::Type value;
            value.credential.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 94: {
            LogStep(94, "Read back the first PIN credential and make sure it is deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 1U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
                               chip::NullOptional

            );
        }
        case 95: {
            LogStep(95, "Read back the first RFID credential and make sure it is deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(2);
            value.credential.credentialIndex = 2U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
                               chip::NullOptional

            );
        }
        case 96: {
            LogStep(96, "Read back the second PIN credential and make sure it is deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 6U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
                               chip::NullOptional

            );
        }
        case 97: {
            LogStep(97, "Read the user related with first PIN back and make sure it is deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 98: {
            LogStep(98, "Read the user related with first RFID back and make sure it is deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 2U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 99: {
            LogStep(99, "Read the user related with second PIN back and make sure it is deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 3U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 100: {
            LogStep(100, "Read the user related with last RFID back and make sure it is deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 4U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 101: {
            LogStep(101, "Create new Programming PIN credential with invalid index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(0);
            value.credential.credentialIndex = 1U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("123456garbage: not in length on purpose"), 6);
            value.userIndex.SetNull();
            value.userStatus.SetNull();
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 102: {
            LogStep(102, "Create new Programming PIN credential with valid index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(0);
            value.credential.credentialIndex = 0U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("123456garbage: not in length on purpose"), 6);
            value.userIndex.SetNull();
            value.userStatus.SetNull();
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 103: {
            LogStep(103, "Verify created user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 104: {
            LogStep(104, "Verify created programming PIN credential");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(0);
            value.credential.credentialIndex = 0U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
                               chip::NullOptional

            );
        }
        case 105: {
            LogStep(105, "Modify the Programming PIN credential");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(2);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(0);
            value.credential.credentialIndex = 0U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("654321garbage: not in length on purpose"), 6);
            value.userIndex.SetNull();
            value.userStatus.SetNull();
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 106: {
            LogStep(106, "Clearing Programming PIN fails");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearCredential::Type value;
            value.credential.SetNonNull();

            value.credential.Value().credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(0);
            value.credential.Value().credentialIndex = 0U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 107: {
            LogStep(107, "Clearing Programming PIN with invalid index fails");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearCredential::Type value;
            value.credential.SetNonNull();

            value.credential.Value().credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(0);
            value.credential.Value().credentialIndex = 1U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 108: {
            LogStep(108, "Clearing PIN credential with zero index fails");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearCredential::Type value;
            value.credential.SetNonNull();

            value.credential.Value().credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.Value().credentialIndex = 0U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 109: {
            LogStep(109, "Clearing PIN credential with out-of-bound index fails");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearCredential::Type value;
            value.credential.SetNonNull();

            value.credential.Value().credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.Value().credentialIndex = static_cast<uint16_t>(NumberOfPINUsersSupported + 1);

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 110: {
            LogStep(110, "Clearing RFID credential with zero index fails");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearCredential::Type value;
            value.credential.SetNonNull();

            value.credential.Value().credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(2);
            value.credential.Value().credentialIndex = 0U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 111: {
            LogStep(111, "Clearing RFID credential with out-of-bound index fails");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearCredential::Type value;
            value.credential.SetNonNull();

            value.credential.Value().credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(2);
            value.credential.Value().credentialIndex = static_cast<uint16_t>(NumberOfRFIDUsersSupported + 1);

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 112: {
            LogStep(112, "Clear the Programming PIN user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearUser::Type value;
            value.userIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 113: {
            LogStep(113, "Make sure Programming PIN user is deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 114: {
            LogStep(114, "Make sure programming PIN credential is deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(0);
            value.credential.credentialIndex = 0U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
                               chip::NullOptional

            );
        }
        case 115: {
            LogStep(115, "Create new PIN credential and user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 1U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("000000garbage: not in length on purpose"), 6);
            value.userIndex.SetNull();
            value.userStatus.SetNull();
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 116: {
            LogStep(116, "Create second PIN credential and add it to existing user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 2U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("000001garbage: not in length on purpose"), 6);
            value.userIndex.SetNonNull();
            value.userIndex.Value() = 1U;
            value.userStatus.SetNull();
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 117: {
            LogStep(117, "Create third PIN credential and add it to existing user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 3U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("000002garbage: not in length on purpose"), 6);
            value.userIndex.SetNonNull();
            value.userIndex.Value() = 1U;
            value.userStatus.SetNull();
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 118: {
            LogStep(118, "Create fourth PIN credential and add it to existing user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 4U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("000003garbage: not in length on purpose"), 6);
            value.userIndex.SetNonNull();
            value.userIndex.Value() = 1U;
            value.userStatus.SetNull();
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 119: {
            LogStep(119, "Create fifth PIN credential and add it to existing user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 5U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("000004garbage: not in length on purpose"), 6);
            value.userIndex.SetNonNull();
            value.userIndex.Value() = 1U;
            value.userStatus.SetNull();
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 120: {
            LogStep(120, "Try to create sixth PIN credential and make sure it fails");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 6U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("000005garbage: not in length on purpose"), 6);
            value.userIndex.SetNonNull();
            value.userIndex.Value() = 1U;
            value.userStatus.SetNull();
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 121: {
            LogStep(121, "Final clean-up");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearUser::Type value;
            value.userIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class DL_LockUnlockSuite : public TestCommand
{
public:
    DL_LockUnlockSuite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("DL_LockUnlock", 38, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~DL_LockUnlockSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlLockState> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("lockState", value));
                VerifyOrReturn(CheckValue("lockState.Value()", value.Value(), 2U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlLockState> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("lockState", value));
                VerifyOrReturn(CheckValue("lockState.Value()", value.Value(), 1U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValueNonNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValue("userIndex.Value()", value.userIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 2U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlLockState> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("lockState", value));
                VerifyOrReturn(CheckValue("lockState.Value()", value.Value(), 1U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlLockState> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("lockState", value));
                VerifyOrReturn(CheckValue("lockState.Value()", value.Value(), 2U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlLockState> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("lockState", value));
                VerifyOrReturn(CheckValue("lockState.Value()", value.Value(), 2U));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlLockState> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("lockState", value));
                VerifyOrReturn(CheckValue("lockState.Value()", value.Value(), 1U));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("userCodeTemporaryDisableTime", value, 10U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlLockState> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("lockState", value));
                VerifyOrReturn(CheckValue("lockState.Value()", value.Value(), 2U));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValueNonNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValue("userIndex.Value()", value.userIndex.Value(), 2U));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 3U));
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlLockState> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("lockState", value));
                VerifyOrReturn(CheckValue("lockState.Value()", value.Value(), 1U));
            }
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlLockState> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("lockState", value));
                VerifyOrReturn(CheckValue("lockState.Value()", value.Value(), 2U));
            }
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlLockState> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("lockState", value));
                VerifyOrReturn(CheckValue("lockState.Value()", value.Value(), 2U));
            }
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlLockState> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("lockState", value));
                VerifyOrReturn(CheckValue("lockState.Value()", value.Value(), 1U));
            }
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Try to unlock the door without PIN");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::UnlockDoor::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::UnlockDoor::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Verify that lock state attribute value is set to Unlocked");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::LockState::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Try to lock the door without a PIN");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::LockDoor::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::LockDoor::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Verify that lock state attribute value is set to Locked");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::LockState::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Create new PIN credential and lock/unlock user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 1U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("123456garbage: not in length on purpose"), 6);
            value.userIndex.SetNull();
            value.userStatus.SetNull();
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Set the WrongCodeEntryLimit to big value so that we can test incorrect PIN entry");
            ListFreer listFreer;
            uint8_t value;
            value = 20U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::WrongCodeEntryLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Try to unlock the door with invalid PIN");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::UnlockDoor::Type value;
            value.pinCode.Emplace();
            value.pinCode.Value() = chip::ByteSpan(chip::Uint8::from_const_char("000000garbage: not in length on purpose"), 6);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::UnlockDoor::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "Verify that lock state attribute value is set to Locked");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::LockState::Id, true,
                                 chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Try to unlock the door with valid PIN");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::UnlockDoor::Type value;
            value.pinCode.Emplace();
            value.pinCode.Value() = chip::ByteSpan(chip::Uint8::from_const_char("123456garbage: not in length on purpose"), 6);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::UnlockDoor::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 10: {
            LogStep(10, "Verify that lock state attribute value is set to Unlocked");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::LockState::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Try to lock the door with invalid PIN");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::LockDoor::Type value;
            value.pinCode.Emplace();
            value.pinCode.Value() = chip::ByteSpan(chip::Uint8::from_const_char("000000garbage: not in length on purpose"), 6);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::LockDoor::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "Verify that lock state attribute value is set to Unlocked");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::LockState::Id, true,
                                 chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Try to lock the door with valid PIN");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::LockDoor::Type value;
            value.pinCode.Emplace();
            value.pinCode.Value() = chip::ByteSpan(chip::Uint8::from_const_char("123456garbage: not in length on purpose"), 6);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::LockDoor::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "Verify that lock state attribute value is set to Locked");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::LockState::Id, true,
                                 chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Set OperatingMode to NoRemoteLockUnlock");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::DlOperatingMode value;
            value = static_cast<chip::app::Clusters::DoorLock::DlOperatingMode>(3);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::OperatingMode::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Try to unlock the door when OperatingMode is NoRemoteLockUnlock");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::UnlockDoor::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::UnlockDoor::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 17: {
            LogStep(17, "Set OperatingMode to Normal");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::DlOperatingMode value;
            value = static_cast<chip::app::Clusters::DoorLock::DlOperatingMode>(0);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::OperatingMode::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Read the lockout timeout");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                 DoorLock::Attributes::UserCodeTemporaryDisableTime::Id, true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Set the WrongCodeEntryLimit to small value so we can test lockout");
            ListFreer listFreer;
            uint8_t value;
            value = 3U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::WrongCodeEntryLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Try to unlock the door with invalid PIN for the first time");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::UnlockDoor::Type value;
            value.pinCode.Emplace();
            value.pinCode.Value() = chip::ByteSpan(chip::Uint8::from_const_char("000000garbage: not in length on purpose"), 6);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::UnlockDoor::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 21: {
            LogStep(21, "Try to unlock the door with invalid PIN for the second time");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::UnlockDoor::Type value;
            value.pinCode.Emplace();
            value.pinCode.Value() = chip::ByteSpan(chip::Uint8::from_const_char("000000garbage: not in length on purpose"), 6);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::UnlockDoor::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 22: {
            LogStep(22, "Try to unlock the door with invalid PIN for the third time");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::UnlockDoor::Type value;
            value.pinCode.Emplace();
            value.pinCode.Value() = chip::ByteSpan(chip::Uint8::from_const_char("000000garbage: not in length on purpose"), 6);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::UnlockDoor::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 23: {
            LogStep(23, "Try to unlock the door with valid PIN and make sure it fails due to lockout");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::UnlockDoor::Type value;
            value.pinCode.Emplace();
            value.pinCode.Value() = chip::ByteSpan(chip::Uint8::from_const_char("123456garbage: not in length on purpose"), 6);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::UnlockDoor::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 24: {
            LogStep(24, "Wait for the lockout to end");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 25: {
            LogStep(25, "Try to unlock the door with valid PIN and make sure it succeeds");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::UnlockDoor::Type value;
            value.pinCode.Emplace();
            value.pinCode.Value() = chip::ByteSpan(chip::Uint8::from_const_char("123456garbage: not in length on purpose"), 6);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::UnlockDoor::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 26: {
            LogStep(26, "Verify that lock state attribute value is set to Unlocked");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::LockState::Id, true,
                                 chip::NullOptional);
        }
        case 27: {
            LogStep(27, "Lock the door back prior to next tests");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::LockDoor::Type value;
            value.pinCode.Emplace();
            value.pinCode.Value() = chip::ByteSpan(chip::Uint8::from_const_char("123456garbage: not in length on purpose"), 6);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::LockDoor::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 28: {
            LogStep(28, "Create a disabled user and credential");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 2U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("654321garbage: not in length on purpose"), 6);
            value.userIndex.SetNull();
            value.userStatus.SetNonNull();
            value.userStatus.Value() = static_cast<chip::app::Clusters::DoorLock::DlUserStatus>(3);
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 29: {
            LogStep(29, "Try to unlock the door with disabled user PIN");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::UnlockDoor::Type value;
            value.pinCode.Emplace();
            value.pinCode.Value() = chip::ByteSpan(chip::Uint8::from_const_char("654321garbage: not in length on purpose"), 6);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::UnlockDoor::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 30: {
            LogStep(30, "Verify that lock state attribute value is set to Locked");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::LockState::Id, true,
                                 chip::NullOptional);
        }
        case 31: {
            LogStep(31, "Unlock the door with enabled user PIN");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::UnlockDoor::Type value;
            value.pinCode.Emplace();
            value.pinCode.Value() = chip::ByteSpan(chip::Uint8::from_const_char("123456garbage: not in length on purpose"), 6);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::UnlockDoor::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 32: {
            LogStep(32, "Verify that lock state attribute value is set to Unlocked");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::LockState::Id, true,
                                 chip::NullOptional);
        }
        case 33: {
            LogStep(33, "Try to lock the door with disabled user PIN");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::LockDoor::Type value;
            value.pinCode.Emplace();
            value.pinCode.Value() = chip::ByteSpan(chip::Uint8::from_const_char("654321garbage: not in length on purpose"), 6);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::LockDoor::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 34: {
            LogStep(34, "Verify that lock state attribute value stays Unlocked");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::LockState::Id, true,
                                 chip::NullOptional);
        }
        case 35: {
            LogStep(35, "Lock the door with enabled user PIN");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::LockDoor::Type value;
            value.pinCode.Emplace();
            value.pinCode.Value() = chip::ByteSpan(chip::Uint8::from_const_char("123456garbage: not in length on purpose"), 6);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::LockDoor::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 36: {
            LogStep(36, "Verify that lock state attribute value is set to Locked");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::LockState::Id, true,
                                 chip::NullOptional);
        }
        case 37: {
            LogStep(37, "Clean all the users and credentials");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearUser::Type value;
            value.userIndex = 65534U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class DL_SchedulesSuite : public TestCommand
{
public:
    DL_SchedulesSuite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("DL_Schedules", 127, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~DL_SchedulesSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    uint16_t NumberOfTotalUsersSupported;
    uint8_t NumberOfWeekDaySchedulesSupportedPerUser;
    uint8_t NumberOfYearDaySchedulesSupportedPerUser;
    uint8_t NumberOfHolidaySchedulesSupported;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValueNonNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValue("userIndex.Value()", value.userIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 2U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("numberOfTotalUsersSupported", value, 10U));
                NumberOfTotalUsersSupported = value;
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("numberOfWeekDaySchedulesSupportedPerUser", value, 10U));
                NumberOfWeekDaySchedulesSupportedPerUser = value;
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("numberOfYearDaySchedulesSupportedPerUser", value, 10U));
                NumberOfYearDaySchedulesSupportedPerUser = value;
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("numberOfHolidaySchedulesSupported", value, 10U));
                NumberOfHolidaySchedulesSupported = value;
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex, 0U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 133U));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex,
                                          static_cast<uint8_t>(NumberOfWeekDaySchedulesSupportedPerUser + 1)));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 133U));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 0U));
                VerifyOrReturn(CheckValue("status", value.status, 133U));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, static_cast<uint16_t>(NumberOfTotalUsersSupported + 1)));
                VerifyOrReturn(CheckValue("status", value.status, 133U));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 2U));
                VerifyOrReturn(CheckValue("status", value.status, 1U));
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
            }
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 0U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 133U));
            }
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex,
                                          static_cast<uint8_t>(NumberOfYearDaySchedulesSupportedPerUser + 1)));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 133U));
            }
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 0U));
                VerifyOrReturn(CheckValue("status", value.status, 133U));
            }
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, static_cast<uint16_t>(NumberOfTotalUsersSupported + 1)));
                VerifyOrReturn(CheckValue("status", value.status, 133U));
            }
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 2U));
                VerifyOrReturn(CheckValue("status", value.status, 1U));
            }
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("holidayIndex", value.holidayIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
            }
            break;
        case 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("holidayIndex", value.holidayIndex, 0U));
                VerifyOrReturn(CheckValue("status", value.status, 133U));
            }
            break;
        case 44:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(
                    CheckValue("holidayIndex", value.holidayIndex, static_cast<uint8_t>(NumberOfHolidaySchedulesSupported + 1)));
                VerifyOrReturn(CheckValue("status", value.status, 133U));
            }
            break;
        case 45:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("holidayIndex", value.holidayIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 12345UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 12345689UL));
                VerifyOrReturn(CheckValuePresent("operatingMode", value.operatingMode));
                VerifyOrReturn(CheckValue("operatingMode.Value()", value.operatingMode.Value(), 0U));
            }
            break;
        case 47:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 48:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("daysMask", value.daysMask));
                VerifyOrReturn(CheckValue("daysMask.Value()", value.daysMask.Value(), 1U));
                VerifyOrReturn(CheckValuePresent("startHour", value.startHour));
                VerifyOrReturn(CheckValue("startHour.Value()", value.startHour.Value(), 15U));
                VerifyOrReturn(CheckValuePresent("startMinute", value.startMinute));
                VerifyOrReturn(CheckValue("startMinute.Value()", value.startMinute.Value(), 16U));
                VerifyOrReturn(CheckValuePresent("endHour", value.endHour));
                VerifyOrReturn(CheckValue("endHour.Value()", value.endHour.Value(), 18U));
                VerifyOrReturn(CheckValuePresent("endMinute", value.endMinute));
                VerifyOrReturn(CheckValue("endMinute.Value()", value.endMinute.Value(), 0U));
            }
            break;
        case 49:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 50:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 12345UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 12345689UL));
            }
            break;
        case 51:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 52:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 53:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 54:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 55:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 56:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("daysMask", value.daysMask));
                VerifyOrReturn(CheckValue("daysMask.Value()", value.daysMask.Value(), 1U));
                VerifyOrReturn(CheckValuePresent("startHour", value.startHour));
                VerifyOrReturn(CheckValue("startHour.Value()", value.startHour.Value(), 15U));
                VerifyOrReturn(CheckValuePresent("startMinute", value.startMinute));
                VerifyOrReturn(CheckValue("startMinute.Value()", value.startMinute.Value(), 16U));
                VerifyOrReturn(CheckValuePresent("endHour", value.endHour));
                VerifyOrReturn(CheckValue("endHour.Value()", value.endHour.Value(), 18U));
                VerifyOrReturn(CheckValuePresent("endMinute", value.endMinute));
                VerifyOrReturn(CheckValue("endMinute.Value()", value.endMinute.Value(), 0U));
            }
            break;
        case 57:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 12345UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 12345689UL));
            }
            break;
        case 58:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("holidayIndex", value.holidayIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 12345UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 12345689UL));
                VerifyOrReturn(CheckValuePresent("operatingMode", value.operatingMode));
                VerifyOrReturn(CheckValue("operatingMode.Value()", value.operatingMode.Value(), 0U));
            }
            break;
        case 59:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 60:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 61:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 62:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 63:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 64:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("daysMask", value.daysMask));
                VerifyOrReturn(CheckValue("daysMask.Value()", value.daysMask.Value(), 1U));
                VerifyOrReturn(CheckValuePresent("startHour", value.startHour));
                VerifyOrReturn(CheckValue("startHour.Value()", value.startHour.Value(), 15U));
                VerifyOrReturn(CheckValuePresent("startMinute", value.startMinute));
                VerifyOrReturn(CheckValue("startMinute.Value()", value.startMinute.Value(), 16U));
                VerifyOrReturn(CheckValuePresent("endHour", value.endHour));
                VerifyOrReturn(CheckValue("endHour.Value()", value.endHour.Value(), 18U));
                VerifyOrReturn(CheckValuePresent("endMinute", value.endMinute));
                VerifyOrReturn(CheckValue("endMinute.Value()", value.endMinute.Value(), 0U));
            }
            break;
        case 65:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 12345UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 12345689UL));
            }
            break;
        case 66:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("holidayIndex", value.holidayIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 12345UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 12345689UL));
                VerifyOrReturn(CheckValuePresent("operatingMode", value.operatingMode));
                VerifyOrReturn(CheckValue("operatingMode.Value()", value.operatingMode.Value(), 0U));
            }
            break;
        case 67:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 68:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 69:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("daysMask", value.daysMask));
                VerifyOrReturn(CheckValue("daysMask.Value()", value.daysMask.Value(), 1U));
                VerifyOrReturn(CheckValuePresent("startHour", value.startHour));
                VerifyOrReturn(CheckValue("startHour.Value()", value.startHour.Value(), 15U));
                VerifyOrReturn(CheckValuePresent("startMinute", value.startMinute));
                VerifyOrReturn(CheckValue("startMinute.Value()", value.startMinute.Value(), 16U));
                VerifyOrReturn(CheckValuePresent("endHour", value.endHour));
                VerifyOrReturn(CheckValue("endHour.Value()", value.endHour.Value(), 18U));
                VerifyOrReturn(CheckValuePresent("endMinute", value.endMinute));
                VerifyOrReturn(CheckValue("endMinute.Value()", value.endMinute.Value(), 0U));
            }
            break;
        case 70:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 12345UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 12345689UL));
            }
            break;
        case 71:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("holidayIndex", value.holidayIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 12345UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 12345689UL));
                VerifyOrReturn(CheckValuePresent("operatingMode", value.operatingMode));
                VerifyOrReturn(CheckValue("operatingMode.Value()", value.operatingMode.Value(), 0U));
            }
            break;
        case 72:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 73:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex, 2U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("daysMask", value.daysMask));
                VerifyOrReturn(CheckValue("daysMask.Value()", value.daysMask.Value(), 2U));
                VerifyOrReturn(CheckValuePresent("startHour", value.startHour));
                VerifyOrReturn(CheckValue("startHour.Value()", value.startHour.Value(), 0U));
                VerifyOrReturn(CheckValuePresent("startMinute", value.startMinute));
                VerifyOrReturn(CheckValue("startMinute.Value()", value.startMinute.Value(), 0U));
                VerifyOrReturn(CheckValuePresent("endHour", value.endHour));
                VerifyOrReturn(CheckValue("endHour.Value()", value.endHour.Value(), 23U));
                VerifyOrReturn(CheckValuePresent("endMinute", value.endMinute));
                VerifyOrReturn(CheckValue("endMinute.Value()", value.endMinute.Value(), 59U));
            }
            break;
        case 74:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 75:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 2U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 9000UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 888888888UL));
            }
            break;
        case 76:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 77:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("holidayIndex", value.holidayIndex, 2U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 123456UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 1234567UL));
                VerifyOrReturn(CheckValuePresent("operatingMode", value.operatingMode));
                VerifyOrReturn(CheckValue("operatingMode.Value()", value.operatingMode.Value(), 1U));
            }
            break;
        case 78:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 79:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
            }
            break;
        case 80:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 81:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex, 2U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
            }
            break;
        case 82:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 12345UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 12345689UL));
            }
            break;
        case 83:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 2U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 9000UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 888888888UL));
            }
            break;
        case 84:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("holidayIndex", value.holidayIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 12345UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 12345689UL));
                VerifyOrReturn(CheckValuePresent("operatingMode", value.operatingMode));
                VerifyOrReturn(CheckValue("operatingMode.Value()", value.operatingMode.Value(), 0U));
            }
            break;
        case 85:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("holidayIndex", value.holidayIndex, 2U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 123456UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 1234567UL));
                VerifyOrReturn(CheckValuePresent("operatingMode", value.operatingMode));
                VerifyOrReturn(CheckValue("operatingMode.Value()", value.operatingMode.Value(), 1U));
            }
            break;
        case 86:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 87:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 88:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
            }
            break;
        case 89:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 90:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 2U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
            }
            break;
        case 91:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("daysMask", value.daysMask));
                VerifyOrReturn(CheckValue("daysMask.Value()", value.daysMask.Value(), 2U));
                VerifyOrReturn(CheckValuePresent("startHour", value.startHour));
                VerifyOrReturn(CheckValue("startHour.Value()", value.startHour.Value(), 0U));
                VerifyOrReturn(CheckValuePresent("startMinute", value.startMinute));
                VerifyOrReturn(CheckValue("startMinute.Value()", value.startMinute.Value(), 0U));
                VerifyOrReturn(CheckValuePresent("endHour", value.endHour));
                VerifyOrReturn(CheckValue("endHour.Value()", value.endHour.Value(), 23U));
                VerifyOrReturn(CheckValuePresent("endMinute", value.endMinute));
                VerifyOrReturn(CheckValue("endMinute.Value()", value.endMinute.Value(), 59U));
            }
            break;
        case 92:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 93:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 94:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 95:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("daysMask", value.daysMask));
                VerifyOrReturn(CheckValue("daysMask.Value()", value.daysMask.Value(), 1U));
                VerifyOrReturn(CheckValuePresent("startHour", value.startHour));
                VerifyOrReturn(CheckValue("startHour.Value()", value.startHour.Value(), 0U));
                VerifyOrReturn(CheckValuePresent("startMinute", value.startMinute));
                VerifyOrReturn(CheckValue("startMinute.Value()", value.startMinute.Value(), 0U));
                VerifyOrReturn(CheckValuePresent("endHour", value.endHour));
                VerifyOrReturn(CheckValue("endHour.Value()", value.endHour.Value(), 23U));
                VerifyOrReturn(CheckValuePresent("endMinute", value.endMinute));
                VerifyOrReturn(CheckValue("endMinute.Value()", value.endMinute.Value(), 59U));
            }
            break;
        case 96:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 97:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 4U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 9000UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 888888888UL));
            }
            break;
        case 98:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 99:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex, 4U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 2U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("daysMask", value.daysMask));
                VerifyOrReturn(CheckValue("daysMask.Value()", value.daysMask.Value(), 64U));
                VerifyOrReturn(CheckValuePresent("startHour", value.startHour));
                VerifyOrReturn(CheckValue("startHour.Value()", value.startHour.Value(), 23U));
                VerifyOrReturn(CheckValuePresent("startMinute", value.startMinute));
                VerifyOrReturn(CheckValue("startMinute.Value()", value.startMinute.Value(), 0U));
                VerifyOrReturn(CheckValuePresent("endHour", value.endHour));
                VerifyOrReturn(CheckValue("endHour.Value()", value.endHour.Value(), 23U));
                VerifyOrReturn(CheckValuePresent("endMinute", value.endMinute));
                VerifyOrReturn(CheckValue("endMinute.Value()", value.endMinute.Value(), 59U));
            }
            break;
        case 100:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 101:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 55555UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 7777777UL));
            }
            break;
        case 102:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 103:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 1U));
            }
            break;
        case 104:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 4U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 1U));
            }
            break;
        case 105:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex, 4U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 2U));
                VerifyOrReturn(CheckValue("status", value.status, 1U));
            }
            break;
        case 106:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 2U));
                VerifyOrReturn(CheckValue("status", value.status, 1U));
            }
            break;
        case 107:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("holidayIndex", value.holidayIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 12345UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 12345689UL));
                VerifyOrReturn(CheckValuePresent("operatingMode", value.operatingMode));
                VerifyOrReturn(CheckValue("operatingMode.Value()", value.operatingMode.Value(), 0U));
            }
            break;
        case 108:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("holidayIndex", value.holidayIndex, 2U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 123456UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 1234567UL));
                VerifyOrReturn(CheckValuePresent("operatingMode", value.operatingMode));
                VerifyOrReturn(CheckValue("operatingMode.Value()", value.operatingMode.Value(), 1U));
            }
            break;
        case 109:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 110:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("holidayIndex", value.holidayIndex, NumberOfHolidaySchedulesSupported));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 1UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 100UL));
                VerifyOrReturn(CheckValuePresent("operatingMode", value.operatingMode));
                VerifyOrReturn(CheckValue("operatingMode.Value()", value.operatingMode.Value(), 4U));
            }
            break;
        case 111:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValueNonNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValue("userIndex.Value()", value.userIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 2U));
            }
            break;
        case 112:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 113:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 114:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 115:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("holidayIndex", value.holidayIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 12345UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 12345689UL));
                VerifyOrReturn(CheckValuePresent("operatingMode", value.operatingMode));
                VerifyOrReturn(CheckValue("operatingMode.Value()", value.operatingMode.Value(), 0U));
            }
            break;
        case 116:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("holidayIndex", value.holidayIndex, 2U));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
            }
            break;
        case 117:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("holidayIndex", value.holidayIndex, NumberOfHolidaySchedulesSupported));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 1UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 100UL));
                VerifyOrReturn(CheckValuePresent("operatingMode", value.operatingMode));
                VerifyOrReturn(CheckValue("operatingMode.Value()", value.operatingMode.Value(), 4U));
            }
            break;
        case 118:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("daysMask", value.daysMask));
                VerifyOrReturn(CheckValue("daysMask.Value()", value.daysMask.Value(), 1U));
                VerifyOrReturn(CheckValuePresent("startHour", value.startHour));
                VerifyOrReturn(CheckValue("startHour.Value()", value.startHour.Value(), 0U));
                VerifyOrReturn(CheckValuePresent("startMinute", value.startMinute));
                VerifyOrReturn(CheckValue("startMinute.Value()", value.startMinute.Value(), 0U));
                VerifyOrReturn(CheckValuePresent("endHour", value.endHour));
                VerifyOrReturn(CheckValue("endHour.Value()", value.endHour.Value(), 23U));
                VerifyOrReturn(CheckValuePresent("endMinute", value.endMinute));
                VerifyOrReturn(CheckValue("endMinute.Value()", value.endMinute.Value(), 59U));
            }
            break;
        case 119:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 9000UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 888888888UL));
            }
            break;
        case 120:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 121:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("holidayIndex", value.holidayIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
            }
            break;
        case 122:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("holidayIndex", value.holidayIndex, 2U));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
            }
            break;
        case 123:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("holidayIndex", value.holidayIndex, NumberOfHolidaySchedulesSupported));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
            }
            break;
        case 124:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("daysMask", value.daysMask));
                VerifyOrReturn(CheckValue("daysMask.Value()", value.daysMask.Value(), 1U));
                VerifyOrReturn(CheckValuePresent("startHour", value.startHour));
                VerifyOrReturn(CheckValue("startHour.Value()", value.startHour.Value(), 0U));
                VerifyOrReturn(CheckValuePresent("startMinute", value.startMinute));
                VerifyOrReturn(CheckValue("startMinute.Value()", value.startMinute.Value(), 0U));
                VerifyOrReturn(CheckValuePresent("endHour", value.endHour));
                VerifyOrReturn(CheckValue("endHour.Value()", value.endHour.Value(), 23U));
                VerifyOrReturn(CheckValuePresent("endMinute", value.endMinute));
                VerifyOrReturn(CheckValue("endMinute.Value()", value.endMinute.Value(), 59U));
            }
            break;
        case 125:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 9000UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 888888888UL));
            }
            break;
        case 126:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Create new PIN credential and schedule user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 1U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("123456garbage: not in length on purpose"), 6);
            value.userIndex.SetNull();
            value.userStatus.SetNull();
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Get number of supported users");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                 DoorLock::Attributes::NumberOfTotalUsersSupported::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Get Max number of Week Day schedules for user and verify default value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                 DoorLock::Attributes::NumberOfWeekDaySchedulesSupportedPerUser::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Get Max number of Year Day schedules for user and verify default value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                 DoorLock::Attributes::NumberOfYearDaySchedulesSupportedPerUser::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Get Max number of Holiday schedules and verify default value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                 DoorLock::Attributes::NumberOfHolidaySchedulesSupported::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Create Week Day schedule with 0 index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetWeekDaySchedule::Type value;
            value.weekDayIndex = 0U;
            value.userIndex    = 1U;
            value.daysMask     = static_cast<chip::BitMask<chip::app::Clusters::DoorLock::DlDaysMaskMap>>(1U);
            value.startHour    = 15U;
            value.startMinute  = 16U;
            value.endHour      = 18U;
            value.endMinute    = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "Create Week Day schedule with out-of-bounds index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetWeekDaySchedule::Type value;
            value.weekDayIndex = static_cast<uint8_t>(NumberOfWeekDaySchedulesSupportedPerUser + 1);
            value.userIndex    = 1U;
            value.daysMask     = static_cast<chip::BitMask<chip::app::Clusters::DoorLock::DlDaysMaskMap>>(1U);
            value.startHour    = 15U;
            value.startMinute  = 16U;
            value.endHour      = 18U;
            value.endMinute    = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "Create Week Day schedule with 0 user index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 0U;
            value.daysMask     = static_cast<chip::BitMask<chip::app::Clusters::DoorLock::DlDaysMaskMap>>(1U);
            value.startHour    = 15U;
            value.startMinute  = 16U;
            value.endHour      = 18U;
            value.endMinute    = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "Create Week Day schedule with out-of-bounds user index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = static_cast<uint16_t>(NumberOfTotalUsersSupported + 1);
            value.daysMask     = static_cast<chip::BitMask<chip::app::Clusters::DoorLock::DlDaysMaskMap>>(1U);
            value.startHour    = 15U;
            value.startMinute  = 16U;
            value.endHour      = 18U;
            value.endMinute    = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 10: {
            LogStep(10, "Create Week Day schedule for non-existing user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 2U;
            value.daysMask     = static_cast<chip::BitMask<chip::app::Clusters::DoorLock::DlDaysMaskMap>>(1U);
            value.startHour    = 15U;
            value.startMinute  = 16U;
            value.endHour      = 18U;
            value.endMinute    = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 11: {
            LogStep(11, "Create Week Day schedule with 0 days mask");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            value.daysMask     = static_cast<chip::BitMask<chip::app::Clusters::DoorLock::DlDaysMaskMap>>(0U);
            value.startHour    = 15U;
            value.startMinute  = 16U;
            value.endHour      = 18U;
            value.endMinute    = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "Create Week Day schedule for Sunday and Monday");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            value.daysMask     = static_cast<chip::BitMask<chip::app::Clusters::DoorLock::DlDaysMaskMap>>(3U);
            value.startHour    = 15U;
            value.startMinute  = 16U;
            value.endHour      = 18U;
            value.endMinute    = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 13: {
            LogStep(13, "Create Week Day schedule for Sunday Wednesday and Saturday");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            value.daysMask     = static_cast<chip::BitMask<chip::app::Clusters::DoorLock::DlDaysMaskMap>>(73U);
            value.startHour    = 15U;
            value.startMinute  = 16U;
            value.endHour      = 18U;
            value.endMinute    = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "Create Week Day schedule with invalid start hour");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            value.daysMask     = static_cast<chip::BitMask<chip::app::Clusters::DoorLock::DlDaysMaskMap>>(1U);
            value.startHour    = 24U;
            value.startMinute  = 16U;
            value.endHour      = 18U;
            value.endMinute    = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 15: {
            LogStep(15, "Create Week Day schedule with invalid start minute");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            value.daysMask     = static_cast<chip::BitMask<chip::app::Clusters::DoorLock::DlDaysMaskMap>>(1U);
            value.startHour    = 15U;
            value.startMinute  = 60U;
            value.endHour      = 18U;
            value.endMinute    = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 16: {
            LogStep(16, "Create Week Day schedule with invalid end hour");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            value.daysMask     = static_cast<chip::BitMask<chip::app::Clusters::DoorLock::DlDaysMaskMap>>(1U);
            value.startHour    = 15U;
            value.startMinute  = 16U;
            value.endHour      = 24U;
            value.endMinute    = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 17: {
            LogStep(17, "Create Week Day schedule with invalid end minute");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            value.daysMask     = static_cast<chip::BitMask<chip::app::Clusters::DoorLock::DlDaysMaskMap>>(1U);
            value.startHour    = 15U;
            value.startMinute  = 16U;
            value.endHour      = 18U;
            value.endMinute    = 60U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 18: {
            LogStep(18, "Create Week Day schedule with start hour later that end hour");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            value.daysMask     = static_cast<chip::BitMask<chip::app::Clusters::DoorLock::DlDaysMaskMap>>(1U);
            value.startHour    = 19U;
            value.startMinute  = 16U;
            value.endHour      = 18U;
            value.endMinute    = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 19: {
            LogStep(19, "Create Week Day schedule with start minute later that end minute when hours are equal");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            value.daysMask     = static_cast<chip::BitMask<chip::app::Clusters::DoorLock::DlDaysMaskMap>>(1U);
            value.startHour    = 15U;
            value.startMinute  = 50U;
            value.endHour      = 15U;
            value.endMinute    = 49U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 20: {
            LogStep(20, "Make sure that previous operations did not create a schedule");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 21: {
            LogStep(21, "Get Week Day schedule with 0 index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = 0U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 22: {
            LogStep(22, "Get Week Day schedule with out-of-bounds index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = static_cast<uint8_t>(NumberOfWeekDaySchedulesSupportedPerUser + 1);
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 23: {
            LogStep(23, "Get Week Day schedule with 0 user index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 24: {
            LogStep(24, "Get Week Day schedule with out-of-bounds user index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = static_cast<uint16_t>(NumberOfTotalUsersSupported + 1);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 25: {
            LogStep(25, "Get Week Day schedule with non-existing user index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 2U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 26: {
            LogStep(26, "Create Year Day schedule with 0 index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetYearDaySchedule::Type value;
            value.yearDayIndex   = 0U;
            value.userIndex      = 1U;
            value.localStartTime = 12345UL;
            value.localEndTime   = 12345689UL;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 27: {
            LogStep(27, "Create Year Day schedule with out-of-bounds index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetYearDaySchedule::Type value;
            value.yearDayIndex   = static_cast<uint8_t>(NumberOfYearDaySchedulesSupportedPerUser + 1);
            value.userIndex      = 1U;
            value.localStartTime = 12345UL;
            value.localEndTime   = 12345689UL;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 28: {
            LogStep(28, "Create Year Day schedule with 0 user index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetYearDaySchedule::Type value;
            value.yearDayIndex   = 1U;
            value.userIndex      = 0U;
            value.localStartTime = 12345UL;
            value.localEndTime   = 12345689UL;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 29: {
            LogStep(29, "Create Year Day schedule with out-of-bounds user index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetYearDaySchedule::Type value;
            value.yearDayIndex   = 1U;
            value.userIndex      = static_cast<uint16_t>(NumberOfTotalUsersSupported + 1);
            value.localStartTime = 12345UL;
            value.localEndTime   = 12345689UL;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 30: {
            LogStep(30, "Create Year Day schedule for non-existing user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetYearDaySchedule::Type value;
            value.yearDayIndex   = 1U;
            value.userIndex      = 2U;
            value.localStartTime = 12345UL;
            value.localEndTime   = 12345689UL;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 31: {
            LogStep(31, "Create Year Day schedule with start hour later that end hour");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetYearDaySchedule::Type value;
            value.yearDayIndex   = 1U;
            value.userIndex      = 1U;
            value.localStartTime = 12345689UL;
            value.localEndTime   = 12345688UL;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 32: {
            LogStep(32, "Make sure that previous operations did not create a schedule");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 33: {
            LogStep(33, "Get Year Day schedule with 0 index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 0U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 34: {
            LogStep(34, "Get Year Day schedule with out-of-bounds index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = static_cast<uint8_t>(NumberOfYearDaySchedulesSupportedPerUser + 1);
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 35: {
            LogStep(35, "Get Year Day schedule with 0 user index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 36: {
            LogStep(36, "Get Year Day schedule with out-of-bounds user index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = static_cast<uint16_t>(NumberOfTotalUsersSupported + 1);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 37: {
            LogStep(37, "Get Year Day schedule with non-existing user index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = 2U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 38: {
            LogStep(38, "Create Holiday schedule with 0 index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetHolidaySchedule::Type value;
            value.holidayIndex   = 0U;
            value.localStartTime = 12345UL;
            value.localEndTime   = 12345689UL;
            value.operatingMode  = static_cast<chip::app::Clusters::DoorLock::DlOperatingMode>(0);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 39: {
            LogStep(39, "Create Holiday schedule with out-of-bounds index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetHolidaySchedule::Type value;
            value.holidayIndex   = static_cast<uint8_t>(NumberOfHolidaySchedulesSupported + 1);
            value.localStartTime = 12345UL;
            value.localEndTime   = 12345689UL;
            value.operatingMode  = static_cast<chip::app::Clusters::DoorLock::DlOperatingMode>(0);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 40: {
            LogStep(40, "Create Holiday schedule with start hour later that end hour");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetHolidaySchedule::Type value;
            value.holidayIndex   = 1U;
            value.localStartTime = 12345689UL;
            value.localEndTime   = 12345688UL;
            value.operatingMode  = static_cast<chip::app::Clusters::DoorLock::DlOperatingMode>(0);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 41: {
            LogStep(41, "Create Holiday schedule with invalid operating mode");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetHolidaySchedule::Type value;
            value.holidayIndex   = 1U;
            value.localStartTime = 12345UL;
            value.localEndTime   = 12345689UL;
            value.operatingMode  = static_cast<chip::app::Clusters::DoorLock::DlOperatingMode>(5);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 42: {
            LogStep(42, "Make sure that previous operations did not create a schedule");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetHolidaySchedule::Type value;
            value.holidayIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 43: {
            LogStep(43, "Get Holiday schedule with 0 index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetHolidaySchedule::Type value;
            value.holidayIndex = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 44: {
            LogStep(44, "Get Holiday schedule with out-of-bounds index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetHolidaySchedule::Type value;
            value.holidayIndex = static_cast<uint8_t>(NumberOfHolidaySchedulesSupported + 1);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 45: {
            LogStep(45, "Create Holiday schedule with valid parameters");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetHolidaySchedule::Type value;
            value.holidayIndex   = 1U;
            value.localStartTime = 12345UL;
            value.localEndTime   = 12345689UL;
            value.operatingMode  = static_cast<chip::app::Clusters::DoorLock::DlOperatingMode>(0);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 46: {
            LogStep(46, "Verify created schedule");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetHolidaySchedule::Type value;
            value.holidayIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 47: {
            LogStep(47, "Create Week Day schedule with valid parameters");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            value.daysMask     = static_cast<chip::BitMask<chip::app::Clusters::DoorLock::DlDaysMaskMap>>(1U);
            value.startHour    = 15U;
            value.startMinute  = 16U;
            value.endHour      = 18U;
            value.endMinute    = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 48: {
            LogStep(48, "Verify created schedule");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 49: {
            LogStep(49, "Create Year Day schedule with valid parameters");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetYearDaySchedule::Type value;
            value.yearDayIndex   = 1U;
            value.userIndex      = 1U;
            value.localStartTime = 12345UL;
            value.localEndTime   = 12345689UL;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 50: {
            LogStep(50, "Verify created schedule");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 51: {
            LogStep(51, "Clear Week Day schedule with 0 index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearWeekDaySchedule::Type value;
            value.weekDayIndex = 0U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 52: {
            LogStep(52, "Clear Week Day schedule with out-of-bounds index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearWeekDaySchedule::Type value;
            value.weekDayIndex = static_cast<uint8_t>(NumberOfWeekDaySchedulesSupportedPerUser + 1);
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 53: {
            LogStep(53, "Clear Week Day schedule with 0 user index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 54: {
            LogStep(54, "Clear Week Day schedule with out-of-bounds user index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = static_cast<uint16_t>(NumberOfTotalUsersSupported + 1);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 55: {
            LogStep(55, "Clear Week Day schedule with non-existing user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 2U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 56: {
            LogStep(56, "Make sure that week day schedule was not deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 57: {
            LogStep(57, "Make sure that year day schedule was not deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 58: {
            LogStep(58, "Make sure that holiday schedule was not deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetHolidaySchedule::Type value;
            value.holidayIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 59: {
            LogStep(59, "Clear Year Day schedule with 0 index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearYearDaySchedule::Type value;
            value.yearDayIndex = 0U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 60: {
            LogStep(60, "Clear Year Day schedule with out-of-bounds index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearYearDaySchedule::Type value;
            value.yearDayIndex = static_cast<uint8_t>(NumberOfYearDaySchedulesSupportedPerUser + 1);
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 61: {
            LogStep(61, "Clear Year Day schedule with 0 user index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 62: {
            LogStep(62, "Clear Year Day schedule with out-of-bounds user index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = static_cast<uint16_t>(NumberOfTotalUsersSupported + 1);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 63: {
            LogStep(63, "Clear Year Day schedule with non-existing user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = 2U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 64: {
            LogStep(64, "Make sure that week day schedule was not deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 65: {
            LogStep(65, "Make sure that year day schedule was not deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 66: {
            LogStep(66, "Make sure that holiday schedule was not deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetHolidaySchedule::Type value;
            value.holidayIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 67: {
            LogStep(67, "Clear Holiday schedule with 0 index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearHolidaySchedule::Type value;
            value.holidayIndex = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 68: {
            LogStep(68, "Clear Holiday schedule with out-of-bounds index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearHolidaySchedule::Type value;
            value.holidayIndex = static_cast<uint8_t>(NumberOfYearDaySchedulesSupportedPerUser + 1);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 69: {
            LogStep(69, "Make sure that week day schedule was not deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 70: {
            LogStep(70, "Make sure that year day schedule was not deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 71: {
            LogStep(71, "Make sure that holiday schedule was not deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetHolidaySchedule::Type value;
            value.holidayIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 72: {
            LogStep(72, "Create another Week Day schedule with valid parameters");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetWeekDaySchedule::Type value;
            value.weekDayIndex = 2U;
            value.userIndex    = 1U;
            value.daysMask     = static_cast<chip::BitMask<chip::app::Clusters::DoorLock::DlDaysMaskMap>>(2U);
            value.startHour    = 0U;
            value.startMinute  = 0U;
            value.endHour      = 23U;
            value.endMinute    = 59U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 73: {
            LogStep(73, "Verify created week day schedule");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = 2U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 74: {
            LogStep(74, "Create another Year Day schedule with valid parameters");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetYearDaySchedule::Type value;
            value.yearDayIndex   = 2U;
            value.userIndex      = 1U;
            value.localStartTime = 9000UL;
            value.localEndTime   = 888888888UL;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 75: {
            LogStep(75, "Verify created year day schedule");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 2U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 76: {
            LogStep(76, "Create another Holiday schedule with valid parameters");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetHolidaySchedule::Type value;
            value.holidayIndex   = 2U;
            value.localStartTime = 123456UL;
            value.localEndTime   = 1234567UL;
            value.operatingMode  = static_cast<chip::app::Clusters::DoorLock::DlOperatingMode>(1);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 77: {
            LogStep(77, "Verify created holiday schedule");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetHolidaySchedule::Type value;
            value.holidayIndex = 2U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 78: {
            LogStep(78, "Clear a single week day schedule for the first user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 79: {
            LogStep(79, "Verify cleared week day schedule");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 80: {
            LogStep(80, "Clear all remaining week day schedules for the first user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearWeekDaySchedule::Type value;
            value.weekDayIndex = 254U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 81: {
            LogStep(81, "Verify cleared week schedule");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = 2U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 82: {
            LogStep(82, "Make sure that first year day schedule was not deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 83: {
            LogStep(83, "Make sure that second year day schedule was not deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 2U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 84: {
            LogStep(84, "Make sure that first holiday schedule was not deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetHolidaySchedule::Type value;
            value.holidayIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 85: {
            LogStep(85, "Make sure that second holiday schedule was not deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetHolidaySchedule::Type value;
            value.holidayIndex = 2U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 86: {
            LogStep(86, "Create another Week Day schedule with valid parameters");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            value.daysMask     = static_cast<chip::BitMask<chip::app::Clusters::DoorLock::DlDaysMaskMap>>(2U);
            value.startHour    = 0U;
            value.startMinute  = 0U;
            value.endHour      = 23U;
            value.endMinute    = 59U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 87: {
            LogStep(87, "Clear a single year day schedule for the first user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 88: {
            LogStep(88, "Verify cleared year day schedule");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 89: {
            LogStep(89, "Clear all remaining year schedules for the first user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearYearDaySchedule::Type value;
            value.yearDayIndex = 254U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 90: {
            LogStep(90, "Verify that second year day schedule was cleared");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 2U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 91: {
            LogStep(91, "Verify created week day schedule");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 92: {
            LogStep(92, "Clear all remaining week day schedules for the first user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearWeekDaySchedule::Type value;
            value.weekDayIndex = 254U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 93: {
            LogStep(93, "Create new user without credential so we can add more schedules to it");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetUser::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);
            value.userIndex     = 2U;
            value.userName.SetNull();
            value.userUniqueId.SetNull();
            value.userStatus.SetNull();
            value.userType.SetNull();
            value.credentialRule.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 94: {
            LogStep(94, "Create Week Day schedule with valid parameters for first user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            value.daysMask     = static_cast<chip::BitMask<chip::app::Clusters::DoorLock::DlDaysMaskMap>>(1U);
            value.startHour    = 0U;
            value.startMinute  = 0U;
            value.endHour      = 23U;
            value.endMinute    = 59U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 95: {
            LogStep(95, "Verify created week day schedule for first user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 96: {
            LogStep(96, "Create Year Day schedule for first user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetYearDaySchedule::Type value;
            value.yearDayIndex   = 4U;
            value.userIndex      = 1U;
            value.localStartTime = 9000UL;
            value.localEndTime   = 888888888UL;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 97: {
            LogStep(97, "Verify created year day schedule for first");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 4U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 98: {
            LogStep(98, "Create Week Day schedule with valid parameters for second user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetWeekDaySchedule::Type value;
            value.weekDayIndex = 4U;
            value.userIndex    = 2U;
            value.daysMask     = static_cast<chip::BitMask<chip::app::Clusters::DoorLock::DlDaysMaskMap>>(64U);
            value.startHour    = 23U;
            value.startMinute  = 0U;
            value.endHour      = 23U;
            value.endMinute    = 59U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 99: {
            LogStep(99, "Verify created week day schedule for first user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = 4U;
            value.userIndex    = 2U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 100: {
            LogStep(100, "Create Year Day schedule for second user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetYearDaySchedule::Type value;
            value.yearDayIndex   = 1U;
            value.userIndex      = 1U;
            value.localStartTime = 55555UL;
            value.localEndTime   = 7777777UL;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 101: {
            LogStep(101, "Verify created year day schedule for first");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 102: {
            LogStep(102, "Cleanup the user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearUser::Type value;
            value.userIndex = 65534U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 103: {
            LogStep(103, "Make sure clearing first user also cleared week day schedules");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 104: {
            LogStep(104, "Make sure clearing first user also cleared year day schedules");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 4U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 105: {
            LogStep(105, "Make sure clearing second user also cleared week day schedules");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = 4U;
            value.userIndex    = 2U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 106: {
            LogStep(106, "Make sure clearing second user also cleared year day schedules");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = 2U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 107: {
            LogStep(107, "Make sure that first holiday schedule was not deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetHolidaySchedule::Type value;
            value.holidayIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 108: {
            LogStep(108, "Make sure that second holiday schedule was not deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetHolidaySchedule::Type value;
            value.holidayIndex = 2U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 109: {
            LogStep(109, "Create another Holiday schedule at the last slot");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetHolidaySchedule::Type value;
            value.holidayIndex   = NumberOfHolidaySchedulesSupported;
            value.localStartTime = 1UL;
            value.localEndTime   = 100UL;
            value.operatingMode  = static_cast<chip::app::Clusters::DoorLock::DlOperatingMode>(4);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 110: {
            LogStep(110, "Verify Created Holiday Schedule");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetHolidaySchedule::Type value;
            value.holidayIndex = NumberOfHolidaySchedulesSupported;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 111: {
            LogStep(111, "Create new PIN credential and schedule user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 1U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("123456garbage: not in length on purpose"), 6);
            value.userIndex.SetNull();
            value.userStatus.SetNull();
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 112: {
            LogStep(112, "Create Week Day schedule for first user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            value.daysMask     = static_cast<chip::BitMask<chip::app::Clusters::DoorLock::DlDaysMaskMap>>(1U);
            value.startHour    = 0U;
            value.startMinute  = 0U;
            value.endHour      = 23U;
            value.endMinute    = 59U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 113: {
            LogStep(113, "Create Year Day schedule for first user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetYearDaySchedule::Type value;
            value.yearDayIndex   = 1U;
            value.userIndex      = 1U;
            value.localStartTime = 9000UL;
            value.localEndTime   = 888888888UL;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 114: {
            LogStep(114, "Clear a single holiday schedule");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearHolidaySchedule::Type value;
            value.holidayIndex = 2U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 115: {
            LogStep(115, "Make sure that first holiday schedule was not deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetHolidaySchedule::Type value;
            value.holidayIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 116: {
            LogStep(116, "Make sure that second holiday schedule was deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetHolidaySchedule::Type value;
            value.holidayIndex = 2U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 117: {
            LogStep(117, "Make sure that third holiday schedule was not deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetHolidaySchedule::Type value;
            value.holidayIndex = NumberOfHolidaySchedulesSupported;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 118: {
            LogStep(118, "Make sure clearing holiday schedule did not clear week day schedule");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 119: {
            LogStep(119, "Make sure clearing holiday schedule did not clear year day schedule");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 120: {
            LogStep(120, "Clear all remaining holiday schedules");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearHolidaySchedule::Type value;
            value.holidayIndex = 254U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 121: {
            LogStep(121, "Make sure that first holiday is still deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetHolidaySchedule::Type value;
            value.holidayIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 122: {
            LogStep(122, "Make sure that second holiday schedule was deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetHolidaySchedule::Type value;
            value.holidayIndex = 2U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 123: {
            LogStep(123, "Make sure that third holiday schedule was not deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetHolidaySchedule::Type value;
            value.holidayIndex = NumberOfHolidaySchedulesSupported;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 124: {
            LogStep(124, "Make sure clearing holiday schedule did not clear week day schedule");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 125: {
            LogStep(125, "Make sure clearing holiday schedule did not clear year day schedule");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 126: {
            LogStep(126, "Final Cleanup");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearUser::Type value;
            value.userIndex = 65534U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DRLK_1_1Suite : public TestCommand
{
public:
    Test_TC_DRLK_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DRLK_1_1", 43, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DRLK_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 6U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 2UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 4UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 16UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 32UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 64UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 128UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 256UL));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1024UL));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 2048UL));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 37UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 38UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 17UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 27UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 28UL));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 18UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 23UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 24UL));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 19UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 25UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 26UL));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 20UL));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 21UL));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 22UL));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 48UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 49UL));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 51UL));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 33UL));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 34UL));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 35UL));
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 36UL));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 39UL));
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 40UL));
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 41UL));
            }
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 42UL));
            }
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 43UL));
            }
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 44UL));
            }
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
            }
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 11UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 12UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 13UL));
            }
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 14UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 15UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 16UL));
            }
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 17UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 18UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 19UL));
            }
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 26UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 27UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 29UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 34UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 36UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 38UL));
            }
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 12UL));
            }
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 15UL));
            }
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 18UL));
            }
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 28UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 35UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 37UL));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH reads the ClusterRevision from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::ClusterRevision::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads the FeatureMap from DUT");
            VerifyOrDo(!ShouldSkip(" !DRLK.S.F00 && !DRLK.S.F01 && !DRLK.S.F02 && !DRLK.S.F04 && !DRLK.S.F05 && !DRLK.S.F06 && "
                                   "!DRLK.S.F07 && !DRLK.S.F08 && !DRLK.S.F0a && !DRLK.S.F0b "),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Given DRLK.S.F00(PIN) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("DRLK.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Given DRLK.S.F01(RID) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("DRLK.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Given DRLK.S.F02(FGP) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("DRLK.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Given DRLK.S.F04(WDSCH) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("DRLK.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Given DRLK.S.F05(DPS) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("DRLK.S.F05"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Given DRLK.S.F06(FACE) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("DRLK.S.F06"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Given DRLK.S.F07(COTA) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("DRLK.S.F07"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Given DRLK.S.F08(USR) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("DRLK.S.F08"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Given DRLK.S.F0a(YDSCH) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("DRLK.S.F0a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Given DRLK.S.F0b(HDSCH) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("DRLK.S.F0b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 13: {
            LogStep(13, "TH reads AttributeList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 14: {
            LogStep(14, "TH reads Feature dependent(DRLK.S.F05) attributes in AttributeList");
            VerifyOrDo(!ShouldSkip("DRLK.S.F05"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 15: {
            LogStep(15, "TH reads Feature dependent(DRLK.S.F08) attributes in AttributeList");
            VerifyOrDo(!ShouldSkip("DRLK.S.F08"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 16: {
            LogStep(16, "TH reads Feature dependent(DRLK.S.F00) attributes in AttributeList");
            VerifyOrDo(!ShouldSkip("DRLK.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 17: {
            LogStep(17, "TH reads Feature dependent(DRLK.S.F01) attributes in AttributeList");
            VerifyOrDo(!ShouldSkip("DRLK.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 18: {
            LogStep(18, "TH reads Feature dependent(DRLK.S.F04) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("DRLK.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 19: {
            LogStep(19, "TH reads Feature dependent(DRLK.S.F0a) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("DRLK.S.F0a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 20: {
            LogStep(20, "TH reads Feature dependent(DRLK.S.F0b) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("DRLK.S.F0b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 21: {
            LogStep(21, "TH reads Feature dependent(DRLK.S.F00 or DRLK.S.F01) attributes in AttributeList");
            VerifyOrDo(!ShouldSkip("DRLK.S.F00 || DRLK.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 22: {
            LogStep(22, "TH reads Feature dependent(DRLK.S.F07 or DRLK.S.F00) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("DRLK.S.F07 || DRLK.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 23: {
            LogStep(23, "TH reads optional attribute(Language) in AttributeList");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0021"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 24: {
            LogStep(24, "TH reads optional attribute(LEDSettings) in AttributeList");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0022"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 25: {
            LogStep(25, "TH reads optional attribute(AutoRelockTime) in AttributeList");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0023"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 26: {
            LogStep(26, "TH reads optional attribute(SoundVolume) in AttributeList");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0024"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 27: {
            LogStep(27, "TH reads optional attribute(DefaultConfigurationRegister) in AttributeList");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0027"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 28: {
            LogStep(28, "TH reads optional attribute(EnableLocalProgramming) in AttributeList");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0028"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 29: {
            LogStep(29, "TH reads optional attribute(EnableOneTouchLocking) in AttributeList");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0029"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 30: {
            LogStep(30, "TH reads optional attribute(EnableInsideStatusLED) in AttributeList");
            VerifyOrDo(!ShouldSkip("DRLK.S.A002a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 31: {
            LogStep(31, "TH reads optional attribute(EnablePrivacyModeButton) in AttributeList");
            VerifyOrDo(!ShouldSkip("DRLK.S.A002b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 32: {
            LogStep(32, "TH reads optional attribute(LocalProgrammingFeatures) in AttributeList");
            VerifyOrDo(!ShouldSkip("DRLK.S.A002c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 33: {
            LogStep(33, "TH reads AcceptedCommandList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 34: {
            LogStep(34, "TH reads Feature dependent commands(DRLK.S.F04) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("DRLK.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 35: {
            LogStep(35, "TH reads Feature dependent commands(DRLK.S.F0a) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("DRLK.S.F0a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 36: {
            LogStep(36, "TH reads Feature dependent commands(DRLK.S.F0b) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("DRLK.S.F0b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 37: {
            LogStep(37, "TH reads Feature dependent commands(DRLK.S.F08) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("DRLK.S.F08"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 38: {
            LogStep(38, "TH reads optional commands(DRLK.S.C03.Rsp) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("DRLK.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 39: {
            LogStep(39, "TH reads Feature dependent command(DRLK.S.F04) in GeneratedCommandList");
            VerifyOrDo(!ShouldSkip("DRLK.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::GeneratedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 40: {
            LogStep(40, "TH reads Feature dependent command(DRLK.S.F0a) in GeneratedCommandList");
            VerifyOrDo(!ShouldSkip("DRLK.S.F0a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::GeneratedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 41: {
            LogStep(41, "TH reads Feature dependent command(DRLK.S.F0b) in GeneratedCommandList");
            VerifyOrDo(!ShouldSkip("DRLK.S.F0b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::GeneratedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 42: {
            LogStep(42, "TH reads Feature dependent command(DRLK.S.F08) in GeneratedCommandList");
            VerifyOrDo(!ShouldSkip("DRLK.S.F08"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::GeneratedCommandList::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DRLK_2_2Suite : public TestCommand
{
public:
    Test_TC_DRLK_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DRLK_2_2", 27, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DRLK_2_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetUserResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValueNonNull("userName", value.userName));
                VerifyOrReturn(CheckValueAsString("userName.Value()", value.userName.Value(), chip::CharSpan("xxx", 3)));
                VerifyOrReturn(CheckValueNonNull("userUniqueId", value.userUniqueId));
                VerifyOrReturn(CheckValue("userUniqueId.Value()", value.userUniqueId.Value(), 6452UL));
                VerifyOrReturn(CheckValueNonNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValue("userStatus.Value()", value.userStatus.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("userType", value.userType));
                VerifyOrReturn(CheckValue("userType.Value()", value.userType.Value(), 0U));
                VerifyOrReturn(CheckValueNonNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValue("credentialRule.Value()", value.credentialRule.Value(), 0U));
                VerifyOrReturn(CheckValueNull("credentials", value.credentials));
                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValue("creatorFabricIndex.Value()", value.creatorFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValue("lastModifiedFabricIndex.Value()", value.lastModifiedFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 2U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetCredentialStatusResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("credentialExists", value.credentialExists, true));
                VerifyOrReturn(CheckValueNonNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValue("userIndex.Value()", value.userIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValue("creatorFabricIndex.Value()", value.creatorFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValue("lastModifiedFabricIndex.Value()", value.lastModifiedFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNull("nextCredentialIndex", value.nextCredentialIndex));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("requirePINforRemoteOperation", value, false));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("requirePINforRemoteOperation", value, true));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Create new user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetUser::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);
            value.userIndex     = 1U;
            value.userName.SetNonNull();
            value.userName.Value() = chip::Span<const char>("xxxgarbage: not in length on purpose", 3);
            value.userUniqueId.SetNonNull();
            value.userUniqueId.Value() = 6452UL;
            value.userStatus.SetNonNull();
            value.userStatus.Value() = static_cast<chip::app::Clusters::DoorLock::DlUserStatus>(1);
            value.userType.SetNonNull();
            value.userType.Value() = static_cast<chip::app::Clusters::DoorLock::DlUserType>(0);
            value.credentialRule.SetNonNull();
            value.credentialRule.Value() = static_cast<chip::app::Clusters::DoorLock::DlCredentialRule>(0);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetUser::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Read the user back and verify its fields");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "Create new PIN credential and lock/unlock user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 1U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("123456garbage: not in length on purpose"), 6);
            value.userIndex.SetNonNull();
            value.userIndex.Value() = 1U;
            value.userStatus.SetNull();
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Verify created PIN credential");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 1U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
                               chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "TH writes the RequirePINforRemoteOperation attribute value as False on the DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0033"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            bool value;
            value = false;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                  DoorLock::Attributes::RequirePINforRemoteOperation::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 6: {
            LogStep(6,
                    "TH writes the RequirePINforRemoteOperation attribute value as False on the DUT and Verify DUT responds with "
                    "UNSUPPORTED_WRITE");
            VerifyOrDo(!ShouldSkip("!DRLK.S.A0033"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            bool value;
            value = false;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                  DoorLock::Attributes::RequirePINforRemoteOperation::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH reads the RequirePINforRemoteOperation attribute from the DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.F07 && DRLK.S.F00 && DRLK.S.A0033"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                 DoorLock::Attributes::RequirePINforRemoteOperation::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH sends Lock Door Command to the DUT without PINCode");
            VerifyOrDo(!ShouldSkip("DRLK.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::LockDoor::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::LockDoor::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "TH sends Lock Door Command to the DUT with valid PINCode");
            VerifyOrDo(!ShouldSkip("DRLK.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::LockDoor::Type value;
            value.pinCode.Emplace();
            value.pinCode.Value() = chip::ByteSpan(chip::Uint8::from_const_char("123456garbage: not in length on purpose"), 6);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::LockDoor::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        case 10: {
            LogStep(10, "TH writes the RequirePINforRemoteOperation attribute value as False on the DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0033"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            bool value;
            value = true;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                  DoorLock::Attributes::RequirePINforRemoteOperation::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 11: {
            LogStep(11,
                    "TH writes the RequirePINforRemoteOperation attribute value as False on the DUT and Verify DUT responds with "
                    "UNSUPPORTED_WRITE");
            VerifyOrDo(!ShouldSkip("!DRLK.S.A0033"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            bool value;
            value = true;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                  DoorLock::Attributes::RequirePINforRemoteOperation::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 12: {
            LogStep(12, "TH reads the RequirePINforRemoteOperation attribute from the DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.F07 && DRLK.S.F00 && DRLK.S.A0033"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                 DoorLock::Attributes::RequirePINforRemoteOperation::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "TH sends Lock Door Command to the DUT with valid PINCode");
            VerifyOrDo(!ShouldSkip("DRLK.S.C00.Rsp && DRLK.S.A0033"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::LockDoor::Type value;
            value.pinCode.Emplace();
            value.pinCode.Value() = chip::ByteSpan(chip::Uint8::from_const_char("123456garbage: not in length on purpose"), 6);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::LockDoor::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "TH sends Lock Door Command to the DUT without valid PINCode");
            VerifyOrDo(!ShouldSkip("DRLK.S.C00.Rsp && DRLK.S.A0033"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::LockDoor::Type value;
            value.pinCode.Emplace();
            value.pinCode.Value() = chip::ByteSpan(chip::Uint8::from_const_char("645321garbage: not in length on purpose"), 6);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::LockDoor::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        case 15: {
            LogStep(15, "TH sends Lock Door Command to the DUT without any argument PINCode");
            VerifyOrDo(!ShouldSkip("DRLK.S.C00.Rsp && DRLK.S.A0033"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::LockDoor::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::LockDoor::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        case 16: {
            LogStep(16, "TH reads the WrongCodeEntryLimit attribute from the DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0030"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::WrongCodeEntryLimit::Id, true,
                                 chip::NullOptional);
        }
        case 17: {
            LogStep(17,
                    "TH sends an Unlock Door Command from the DUT with invalid PINCode. Repeat this step "
                    "PIXIT.DRLK.WrongCodeEntryLimit times and Verify that DUT sends failure response to the TH");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DRLK.S.A0030"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 18: {
            LogStep(18, "TH sends an Unlock Door Command from User1 to the DUT with the valid PINCode and verify the DUT response");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DRLK.S.A0030"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 19: {
            LogStep(19,
                    "Wait for PIXIT.DRLK.UserCodeTemporaryDisableTime.TH then sends an Unlock Door Command from User1 to the DUT "
                    "with the valid PINCode.");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DRLK.S.A0030"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 20: {
            LogStep(20,
                    "TH writes WrongCodeEntryLimit attribute value as between 1 and 255 on the DUT and Verify that the DUT sends "
                    "Success response");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0030"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 3U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::WrongCodeEntryLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 21: {
            LogStep(21,
                    "TH writes WrongCodeEntryLimit attribute value as between 1 and 255 on the DUT and verify DUT responds with "
                    "UNSUPPORTED_WRITE");
            VerifyOrDo(!ShouldSkip("!DRLK.S.A0030"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 3U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::WrongCodeEntryLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "TH reads the UserCodeTemporaryDisableTime attribute from the DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0031"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                 DoorLock::Attributes::UserCodeTemporaryDisableTime::Id, true, chip::NullOptional);
        }
        case 23: {
            LogStep(23,
                    "TH writes UserCodeTemporaryDisableTime attribute value as between 1 and 255 on the DUT and Verify that the "
                    "DUT sends Success response");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0031"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 15U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                  DoorLock::Attributes::UserCodeTemporaryDisableTime::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 24: {
            LogStep(24,
                    "TH writes UserCodeTemporaryDisableTime attribute value as between 1 and 255 on the DUT and verify DUT "
                    "responds with UNSUPPORTED_WRITE");
            VerifyOrDo(!ShouldSkip("!DRLK.S.A0031"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 15U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                  DoorLock::Attributes::UserCodeTemporaryDisableTime::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 25: {
            LogStep(25, "Clean the created user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearUser::Type value;
            value.userIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearUser::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        case 26: {
            LogStep(26, "Cleanup the created credential");
            VerifyOrDo(!ShouldSkip("DRLK.S.C26.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearCredential::Type value;
            value.credential.SetNonNull();

            value.credential.Value().credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.Value().credentialIndex = 1U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearCredential::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DRLK_2_3Suite : public TestCommand
{
public:
    Test_TC_DRLK_2_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DRLK_2_3", 36, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DRLK_2_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(mTimeout.ValueOr(200)); }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetUserResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValueNonNull("userName", value.userName));
                VerifyOrReturn(CheckValueAsString("userName.Value()", value.userName.Value(), chip::CharSpan("xxx", 3)));
                VerifyOrReturn(CheckValueNonNull("userUniqueId", value.userUniqueId));
                VerifyOrReturn(CheckValue("userUniqueId.Value()", value.userUniqueId.Value(), 6452UL));
                VerifyOrReturn(CheckValueNonNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValue("userStatus.Value()", value.userStatus.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("userType", value.userType));
                VerifyOrReturn(CheckValue("userType.Value()", value.userType.Value(), 0U));
                VerifyOrReturn(CheckValueNonNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValue("credentialRule.Value()", value.credentialRule.Value(), 0U));
                VerifyOrReturn(CheckValueNull("credentials", value.credentials));
                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValue("creatorFabricIndex.Value()", value.creatorFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValue("lastModifiedFabricIndex.Value()", value.lastModifiedFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 2U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetCredentialStatusResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("credentialExists", value.credentialExists, true));
                VerifyOrReturn(CheckValueNonNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValue("userIndex.Value()", value.userIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValue("creatorFabricIndex.Value()", value.creatorFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValue("lastModifiedFabricIndex.Value()", value.lastModifiedFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNull("nextCredentialIndex", value.nextCredentialIndex));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("requirePINforRemoteOperation", value, false));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("requirePINforRemoteOperation", value, true));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("userCodeTemporaryDisableTime", value, 15U));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("autoRelockTime", value, 10UL));
            }
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("autoRelockTime", value, 60UL));
            }
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Create new user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetUser::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);
            value.userIndex     = 1U;
            value.userName.SetNonNull();
            value.userName.Value() = chip::Span<const char>("xxxgarbage: not in length on purpose", 3);
            value.userUniqueId.SetNonNull();
            value.userUniqueId.Value() = 6452UL;
            value.userStatus.SetNonNull();
            value.userStatus.Value() = static_cast<chip::app::Clusters::DoorLock::DlUserStatus>(1);
            value.userType.SetNonNull();
            value.userType.Value() = static_cast<chip::app::Clusters::DoorLock::DlUserType>(0);
            value.credentialRule.SetNonNull();
            value.credentialRule.Value() = static_cast<chip::app::Clusters::DoorLock::DlCredentialRule>(0);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetUser::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Read the user back and verify its fields");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "Create new PIN credential and lock/unlock user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 1U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("123456garbage: not in length on purpose"), 6);
            value.userIndex.SetNonNull();
            value.userIndex.Value() = 1U;
            value.userStatus.SetNull();
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Verify created PIN credential");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 1U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
                               chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "TH writes the RequirePINforRemoteOperation attribute value as False on the DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.F07 && DRLK.S.F00 && DRLK.S.A0033"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            bool value;
            value = false;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                  DoorLock::Attributes::RequirePINforRemoteOperation::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 6: {
            LogStep(6,
                    "TH writes the RequirePINforRemoteOperation attribute value as False on the DUT and Verify DUT responds with "
                    "UNSUPPORTED_WRITE");
            VerifyOrDo(!ShouldSkip("DRLK.S.F07 && DRLK.S.F00 && ! DRLK.S.A0033"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            bool value;
            value = false;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                  DoorLock::Attributes::RequirePINforRemoteOperation::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH reads the RequirePINforRemoteOperation attribute from the DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.F07 && DRLK.S.F00 && DRLK.S.A0033"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                 DoorLock::Attributes::RequirePINforRemoteOperation::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH sends the unlock Door command to the DUT without PINCode");
            VerifyOrDo(!ShouldSkip("DRLK.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::UnlockDoor::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::UnlockDoor::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "TH sends the unlock Door command to the DUT with valid PINCode");
            VerifyOrDo(!ShouldSkip("DRLK.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::UnlockDoor::Type value;
            value.pinCode.Emplace();
            value.pinCode.Value() = chip::ByteSpan(chip::Uint8::from_const_char("123456garbage: not in length on purpose"), 6);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::UnlockDoor::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        case 10: {
            LogStep(10, "TH writes the RequirePINforRemoteOperation attribute value as False on the DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.F07 && DRLK.S.F00 && DRLK.S.A0033"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            bool value;
            value = true;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                  DoorLock::Attributes::RequirePINforRemoteOperation::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 11: {
            LogStep(11,
                    "TH writes the RequirePINforRemoteOperation attribute value as False on the DUT and Verify DUT responds with "
                    "UNSUPPORTED_WRITE");
            VerifyOrDo(!ShouldSkip("DRLK.S.F07 && DRLK.S.F00 && ! DRLK.S.A0033"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            bool value;
            value = true;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                  DoorLock::Attributes::RequirePINforRemoteOperation::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 12: {
            LogStep(12, "TH reads the RequirePINforRemoteOperation attribute from the DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.F07 && DRLK.S.F00 && DRLK.S.A0033"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                 DoorLock::Attributes::RequirePINforRemoteOperation::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "TH sends the unlock Door command to the DUT with valid PINCode");
            VerifyOrDo(!ShouldSkip("DRLK.S.C01.Rsp && DRLK.S.A0033"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::UnlockDoor::Type value;
            value.pinCode.Emplace();
            value.pinCode.Value() = chip::ByteSpan(chip::Uint8::from_const_char("123456garbage: not in length on purpose"), 6);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::UnlockDoor::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "TH sends the unlock Door command to the DUT with invalid PINCode");
            VerifyOrDo(!ShouldSkip("DRLK.S.C01.Rsp && DRLK.S.A0033"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::UnlockDoor::Type value;
            value.pinCode.Emplace();
            value.pinCode.Value() = chip::ByteSpan(chip::Uint8::from_const_char("1234568garbage: not in length on purpose"), 7);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::UnlockDoor::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        case 15: {
            LogStep(15, "TH sends the unlock Door command to the DUT without PINCode");
            VerifyOrDo(!ShouldSkip("DRLK.S.C01.Rsp && DRLK.S.A0033"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::UnlockDoor::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::UnlockDoor::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        case 16: {
            LogStep(16,
                    "TH writes WrongCodeEntryLimit attribute value as 3 on the DUT and Verify that the DUT sends Success response");
            VerifyOrDo(!ShouldSkip("DRLK.S.F00 && DRLK.S.F01 && DRLK.S.A0030"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 3U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::WrongCodeEntryLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 17: {
            LogStep(17,
                    "TH writes WrongCodeEntryLimit attribute value as 3 on the DUT and verify DUT responds with UNSUPPORTED_WRITE");
            VerifyOrDo(!ShouldSkip("DRLK.S.F00 && DRLK.S.F01 && ! DRLK.S.A0030"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 3U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::WrongCodeEntryLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 18: {
            LogStep(18,
                    "TH writes UserCodeTemporaryDisableTime attribute value as 15 Seconds on the DUT and Verify that the DUT sends "
                    "Success response");
            VerifyOrDo(!ShouldSkip("DRLK.S.F00 && DRLK.S.F01 && DRLK.S.A0031"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 15U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                  DoorLock::Attributes::UserCodeTemporaryDisableTime::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 19: {
            LogStep(19,
                    "TH writes UserCodeTemporaryDisableTime attribute value as 15 Seconds on the DUT and Verify that the DUT sends "
                    "Success response");
            VerifyOrDo(!ShouldSkip("DRLK.S.F00 && DRLK.S.F01 && ! DRLK.S.A0031"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 15U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                  DoorLock::Attributes::UserCodeTemporaryDisableTime::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 20: {
            LogStep(20, "TH sends the unlock Door command to the DUT with invalid PINCode");
            VerifyOrDo(!ShouldSkip("DRLK.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::UnlockDoor::Type value;
            value.pinCode.Emplace();
            value.pinCode.Value() = chip::ByteSpan(chip::Uint8::from_const_char("1234568garbage: not in length on purpose"), 7);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::UnlockDoor::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        case 21: {
            LogStep(21, "TH sends the unlock Door command to the DUT with invalid PINCode");
            VerifyOrDo(!ShouldSkip("DRLK.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::UnlockDoor::Type value;
            value.pinCode.Emplace();
            value.pinCode.Value() = chip::ByteSpan(chip::Uint8::from_const_char("1234568garbage: not in length on purpose"), 7);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::UnlockDoor::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        case 22: {
            LogStep(22, "TH sends the unlock Door command to the DUT with invalid PINCode");
            VerifyOrDo(!ShouldSkip("DRLK.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::UnlockDoor::Type value;
            value.pinCode.Emplace();
            value.pinCode.Value() = chip::ByteSpan(chip::Uint8::from_const_char("1234568garbage: not in length on purpose"), 7);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::UnlockDoor::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        case 23: {
            LogStep(23, "TH sends the unlock Door command to the DUT with invalid PINCode");
            VerifyOrDo(!ShouldSkip("DRLK.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::UnlockDoor::Type value;
            value.pinCode.Emplace();
            value.pinCode.Value() = chip::ByteSpan(chip::Uint8::from_const_char("1234568garbage: not in length on purpose"), 7);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::UnlockDoor::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        case 24: {
            LogStep(24, "TH reads the UserCodeTemporaryDisableTime attribute from the DUT and check attribute is triggered");
            VerifyOrDo(!ShouldSkip("DRLK.S.F07 && DRLK.S.F00 && DRLK.S.A0031"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                 DoorLock::Attributes::UserCodeTemporaryDisableTime::Id, true, chip::NullOptional);
        }
        case 25: {
            LogStep(25, "TH sends the unlock Door command to the DUT with valid PINCode");
            VerifyOrDo(!ShouldSkip("DRLK.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::UnlockDoor::Type value;
            value.pinCode.Emplace();
            value.pinCode.Value() = chip::ByteSpan(chip::Uint8::from_const_char("123456garbage: not in length on purpose"), 6);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::UnlockDoor::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        case 26: {
            LogStep(26, "TH writes AutoRelockTime attribute value as 10 seconds on the DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0023 && PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint32_t value;
            value = 10UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AutoRelockTime::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 27: {
            LogStep(27, "TH writes AutoRelockTime attribute value as 60 seconds on the DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0023 && PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint32_t value;
            value = 60UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AutoRelockTime::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 28: {
            LogStep(28, "TH writes AutoRelockTime attribute value as 10 seconds on the DUT");
            VerifyOrDo(!ShouldSkip("!DRLK.S.A0023 && PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint32_t value;
            value = 10UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AutoRelockTime::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 29: {
            LogStep(29, "TH writes AutoRelockTime attribute value as 60 seconds on the DUT");
            VerifyOrDo(!ShouldSkip("!DRLK.S.A0023 && PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint32_t value;
            value = 60UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AutoRelockTime::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 30: {
            LogStep(30, "TH reads the AutoRelockTime attribute from the DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0023 && PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AutoRelockTime::Id, true,
                                 chip::NullOptional);
        }
        case 31: {
            LogStep(31, "TH reads the AutoRelockTime attribute from the DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0023 && PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AutoRelockTime::Id, true,
                                 chip::NullOptional);
        }
        case 32: {
            LogStep(32,
                    "TH sends the unlock Door command to the DUT with valid PINCode and Verify that DUT sends SUCCESS response to "
                    "the TH");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DRLK.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 33: {
            LogStep(33, "TH reads LockState attribute after AutoRelockTime Expires and Verify that the DUT is locked.");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DRLK.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 34: {
            LogStep(34, "Cleanup the created user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearUser::Type value;
            value.userIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearUser::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        case 35: {
            LogStep(35, "Clean the created credential");
            VerifyOrDo(!ShouldSkip("DRLK.S.C26.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearCredential::Type value;
            value.credential.SetNonNull();

            value.credential.Value().credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.Value().credentialIndex = 1U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearCredential::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DRLK_2_4Suite : public TestCommand
{
public:
    Test_TC_DRLK_2_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DRLK_2_4", 12, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DRLK_2_4Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetUserResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValueNonNull("userName", value.userName));
                VerifyOrReturn(CheckValueAsString("userName.Value()", value.userName.Value(), chip::CharSpan("xxx", 3)));
                VerifyOrReturn(CheckValueNonNull("userUniqueId", value.userUniqueId));
                VerifyOrReturn(CheckValue("userUniqueId.Value()", value.userUniqueId.Value(), 6452UL));
                VerifyOrReturn(CheckValueNonNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValue("userStatus.Value()", value.userStatus.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("userType", value.userType));
                VerifyOrReturn(CheckValue("userType.Value()", value.userType.Value(), 0U));
                VerifyOrReturn(CheckValueNonNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValue("credentialRule.Value()", value.credentialRule.Value(), 0U));
                VerifyOrReturn(CheckValueNull("credentials", value.credentials));
                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValue("creatorFabricIndex.Value()", value.creatorFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValue("lastModifiedFabricIndex.Value()", value.lastModifiedFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 2U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetCredentialStatusResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("credentialExists", value.credentialExists, true));
                VerifyOrReturn(CheckValueNonNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValue("userIndex.Value()", value.userIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValue("creatorFabricIndex.Value()", value.creatorFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValue("lastModifiedFabricIndex.Value()", value.lastModifiedFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNull("nextCredentialIndex", value.nextCredentialIndex));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlLockState> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("lockState", value));
                VerifyOrReturn(CheckValue("lockState.Value()", value.Value(), 1U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Create new user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetUser::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);
            value.userIndex     = 1U;
            value.userName.SetNonNull();
            value.userName.Value() = chip::Span<const char>("xxxgarbage: not in length on purpose", 3);
            value.userUniqueId.SetNonNull();
            value.userUniqueId.Value() = 6452UL;
            value.userStatus.SetNonNull();
            value.userStatus.Value() = static_cast<chip::app::Clusters::DoorLock::DlUserStatus>(1);
            value.userType.SetNonNull();
            value.userType.Value() = static_cast<chip::app::Clusters::DoorLock::DlUserType>(0);
            value.credentialRule.SetNonNull();
            value.credentialRule.Value() = static_cast<chip::app::Clusters::DoorLock::DlCredentialRule>(0);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetUser::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Read the user back and verify its fields");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "Create new PIN credential and lock/unlock user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 1U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("123456garbage: not in length on purpose"), 6);
            value.userIndex.SetNonNull();
            value.userIndex.Value() = 1U;
            value.userStatus.SetNull();
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Verify created PIN credential");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 1U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
                               chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "TH writes AutoRelockTime attribute value as 60 seconds on the DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0023"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint32_t value;
            value = 60UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AutoRelockTime::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH writes AutoRelockTime attribute value as 60 seconds on the DUT");
            VerifyOrDo(!ShouldSkip(" !DRLK.S.A0023 "), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint32_t value;
            value = 60UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AutoRelockTime::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH sends the Unlock with Timeout argument value as 60 seconds");
            VerifyOrDo(!ShouldSkip("DRLK.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::UnlockWithTimeout::Type value;
            value.timeout = 60U;
            value.pinCode.Emplace();
            value.pinCode.Value() = chip::ByteSpan(chip::Uint8::from_const_char("123456garbage: not in length on purpose"), 6);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::UnlockWithTimeout::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "Wait 60s");
            VerifyOrDo(!ShouldSkip("DRLK.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 60000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "TH reads LockState attribute");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0000 && DRLK.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::LockState::Id, true,
                                 chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Cleanup the created user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearUser::Type value;
            value.userIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearUser::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        case 11: {
            LogStep(11, "Clean the created credential");
            VerifyOrDo(!ShouldSkip("DRLK.S.C26.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearCredential::Type value;
            value.credential.SetNonNull();

            value.credential.Value().credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.Value().credentialIndex = 1U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearCredential::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DRLK_2_5Suite : public TestCommand
{
public:
    Test_TC_DRLK_2_5Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DRLK_2_5", 12, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DRLK_2_5Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    uint8_t NumberOfWeekDaySchedulesSupportedPerUser;
    uint16_t NumberOfTotalUsersSupported;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetUserResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValueNonNull("userName", value.userName));
                VerifyOrReturn(CheckValueAsString("userName.Value()", value.userName.Value(), chip::CharSpan("xxx", 3)));
                VerifyOrReturn(CheckValueNonNull("userUniqueId", value.userUniqueId));
                VerifyOrReturn(CheckValue("userUniqueId.Value()", value.userUniqueId.Value(), 6452UL));
                VerifyOrReturn(CheckValueNonNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValue("userStatus.Value()", value.userStatus.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("userType", value.userType));
                VerifyOrReturn(CheckValue("userType.Value()", value.userType.Value(), 0U));
                VerifyOrReturn(CheckValueNonNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValue("credentialRule.Value()", value.credentialRule.Value(), 0U));
                VerifyOrReturn(CheckValueNull("credentials", value.credentials));
                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValue("creatorFabricIndex.Value()", value.creatorFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValue("lastModifiedFabricIndex.Value()", value.lastModifiedFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
                NumberOfWeekDaySchedulesSupportedPerUser = value;
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65534U));
                NumberOfTotalUsersSupported = value;
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("daysMask", value.daysMask));
                VerifyOrReturn(CheckValue("daysMask.Value()", value.daysMask.Value(), 2U));
                VerifyOrReturn(CheckValuePresent("startHour", value.startHour));
                VerifyOrReturn(CheckValue("startHour.Value()", value.startHour.Value(), 15U));
                VerifyOrReturn(CheckValuePresent("startMinute", value.startMinute));
                VerifyOrReturn(CheckValue("startMinute.Value()", value.startMinute.Value(), 45U));
                VerifyOrReturn(CheckConstraintHasValue("value.endHour", value.endHour, true));
                VerifyOrReturn(CheckConstraintMinValue("value.endHour.Value()", value.endHour.Value(), 16U));
                VerifyOrReturn(CheckConstraintHasValue("value.endMinute", value.endMinute, true));
                VerifyOrReturn(CheckConstraintMinValue("value.endMinute.Value()", value.endMinute.Value(), 55U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex, 0U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 133U));
                VerifyOrReturn(CheckConstraintHasValue("value.daysMask", value.daysMask, false));
                VerifyOrReturn(CheckConstraintHasValue("value.startHour", value.startHour, false));
                VerifyOrReturn(CheckConstraintHasValue("value.startMinute", value.startMinute, false));
                VerifyOrReturn(CheckConstraintHasValue("value.endHour", value.endHour, false));
                VerifyOrReturn(CheckConstraintHasValue("value.endMinute", value.endMinute, false));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
                VerifyOrReturn(CheckConstraintHasValue("value.daysMask", value.daysMask, false));
                VerifyOrReturn(CheckConstraintHasValue("value.startHour", value.startHour, false));
                VerifyOrReturn(CheckConstraintHasValue("value.startMinute", value.startMinute, false));
                VerifyOrReturn(CheckConstraintHasValue("value.endHour", value.endHour, false));
                VerifyOrReturn(CheckConstraintHasValue("value.endMinute", value.endMinute, false));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Create new user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetUser::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);
            value.userIndex     = 1U;
            value.userName.SetNonNull();
            value.userName.Value() = chip::Span<const char>("xxxgarbage: not in length on purpose", 3);
            value.userUniqueId.SetNonNull();
            value.userUniqueId.Value() = 6452UL;
            value.userStatus.SetNonNull();
            value.userStatus.Value() = static_cast<chip::app::Clusters::DoorLock::DlUserStatus>(1);
            value.userType.SetNonNull();
            value.userType.Value() = static_cast<chip::app::Clusters::DoorLock::DlUserType>(0);
            value.credentialRule.SetNonNull();
            value.credentialRule.Value() = static_cast<chip::app::Clusters::DoorLock::DlCredentialRule>(0);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Read the user back and verify its fields");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "TH reads NumberOfWeekDay SchedulesSupportedPerUser attribute");
            VerifyOrDo(!ShouldSkip("DRLK.S.F04 && DRLK.S.A0014"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                 DoorLock::Attributes::NumberOfWeekDaySchedulesSupportedPerUser::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads NumberOfTotalUsers Supported attribute");
            VerifyOrDo(!ShouldSkip("DRLK.S.F08 && DRLK.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                 DoorLock::Attributes::NumberOfTotalUsersSupported::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH send Set Week Day Schedule Command");
            VerifyOrDo(!ShouldSkip("DRLK.S.F04 && DRLK.S.C0b.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            value.daysMask     = static_cast<chip::BitMask<chip::app::Clusters::DoorLock::DlDaysMaskMap>>(2U);
            value.startHour    = 15U;
            value.startMinute  = 45U;
            value.endHour      = 16U;
            value.endMinute    = 55U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "TH send Get Week Day Schedule Command to DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.F04 && DRLK.S.C0c.Rsp && DRLK.S.C0c.Tx"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "TH send Set Week Day Schedule Command");
            VerifyOrDo(!ShouldSkip("DRLK.S.F04 && DRLK.S.C0b.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetWeekDaySchedule::Type value;
            value.weekDayIndex = 0U;
            value.userIndex    = 1U;
            value.daysMask     = static_cast<chip::BitMask<chip::app::Clusters::DoorLock::DlDaysMaskMap>>(7U);
            value.startHour    = 15U;
            value.startMinute  = 45U;
            value.endHour      = 16U;
            value.endMinute    = 55U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "TH send Get Week Day Schedule Command to DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.F04 && DRLK.S.C0c.Rsp && DRLK.S.C0c.Tx"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = 0U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "TH sends Clear Week Day Schedule Command to DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.F04 && DRLK.S.C0d.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 10: {
            LogStep(10, "TH sends Get Week Day Schedule Command to DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.F04 && DRLK.S.C0c.Rsp && DRLK.S.C0c.Tx"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 11: {
            LogStep(11, "Cleanup the created user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearUser::Type value;
            value.userIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DRLK_2_7Suite : public TestCommand
{
public:
    Test_TC_DRLK_2_7Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DRLK_2_7", 18, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DRLK_2_7Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    uint8_t NumberOfYearDaySchedulesSupportedPerUser;
    uint16_t NumberOfTotalUsersSupported;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetUserResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValueNonNull("userName", value.userName));
                VerifyOrReturn(CheckValueAsString("userName.Value()", value.userName.Value(), chip::CharSpan("xxx", 3)));
                VerifyOrReturn(CheckValueNonNull("userUniqueId", value.userUniqueId));
                VerifyOrReturn(CheckValue("userUniqueId.Value()", value.userUniqueId.Value(), 6452UL));
                VerifyOrReturn(CheckValueNonNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValue("userStatus.Value()", value.userStatus.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("userType", value.userType));
                VerifyOrReturn(CheckValue("userType.Value()", value.userType.Value(), 0U));
                VerifyOrReturn(CheckValueNonNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValue("credentialRule.Value()", value.credentialRule.Value(), 0U));
                VerifyOrReturn(CheckValueNull("credentials", value.credentials));
                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValue("creatorFabricIndex.Value()", value.creatorFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValue("lastModifiedFabricIndex.Value()", value.lastModifiedFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
                NumberOfYearDaySchedulesSupportedPerUser = value;
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65534U));
                NumberOfTotalUsersSupported = value;
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 960UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 1980UL));
                if (value.localEndTime.HasValue())
                {
                    VerifyOrReturn(CheckConstraintMinValue("value.localEndTime.Value()", value.localEndTime.Value(), 961UL));
                }
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 0U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 15U));
                VerifyOrReturn(CheckValue("status", value.status, 133U));
                VerifyOrReturn(CheckConstraintHasValue("value.localStartTime", value.localStartTime, false));
                VerifyOrReturn(CheckConstraintHasValue("value.localEndTime", value.localEndTime, false));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, NumberOfYearDaySchedulesSupportedPerUser));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 5U));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
                VerifyOrReturn(CheckConstraintHasValue("value.localStartTime", value.localStartTime, false));
                VerifyOrReturn(CheckConstraintHasValue("value.localEndTime", value.localEndTime, false));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
                VerifyOrReturn(CheckConstraintHasValue("value.localStartTime", value.localStartTime, false));
                VerifyOrReturn(CheckConstraintHasValue("value.localEndTime", value.localEndTime, false));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 1080UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 2100UL));
                if (value.localEndTime.HasValue())
                {
                    VerifyOrReturn(CheckConstraintMinValue("value.localEndTime.Value()", value.localEndTime.Value(), 1081UL));
                }
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Create new user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetUser::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);
            value.userIndex     = 1U;
            value.userName.SetNonNull();
            value.userName.Value() = chip::Span<const char>("xxxgarbage: not in length on purpose", 3);
            value.userUniqueId.SetNonNull();
            value.userUniqueId.Value() = 6452UL;
            value.userStatus.SetNonNull();
            value.userStatus.Value() = static_cast<chip::app::Clusters::DoorLock::DlUserStatus>(1);
            value.userType.SetNonNull();
            value.userType.Value() = static_cast<chip::app::Clusters::DoorLock::DlUserType>(0);
            value.credentialRule.SetNonNull();
            value.credentialRule.Value() = static_cast<chip::app::Clusters::DoorLock::DlCredentialRule>(0);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Read the user back and verify its fields");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "TH reads NumberOfYearDay SchedulesSupportedPerUser attribute");
            VerifyOrDo(!ShouldSkip("DRLK.S.F0a && DRLK.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                 DoorLock::Attributes::NumberOfYearDaySchedulesSupportedPerUser::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads NumberOfTotalUsers Supported attribute");
            VerifyOrDo(!ShouldSkip("DRLK.S.F08 && DRLK.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                 DoorLock::Attributes::NumberOfTotalUsersSupported::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH sends Set Year Day Schedule Command to DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.F0a && DRLK.S.C0e.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetYearDaySchedule::Type value;
            value.yearDayIndex   = 1U;
            value.userIndex      = 1U;
            value.localStartTime = 960UL;
            value.localEndTime   = 1980UL;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "TH sends Get Year Day Schedule Command to DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.F0a && DRLK.S.C0f.Rsp && DRLK.S.C0f.Tx"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "TH send Set Year Day Schedule Command to DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.C0e.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetYearDaySchedule::Type value;
            value.yearDayIndex   = 0U;
            value.userIndex      = 15U;
            value.localStartTime = 1020UL;
            value.localEndTime   = 2040UL;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "TH sends Get Year Day Schedule Command to DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.F0a && DRLK.S.C0f.Rsp && DRLK.S.C0f.Tx"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 0U;
            value.userIndex    = 15U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "Create a user with userIndex as 5");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetUser::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);
            value.userIndex     = 5U;
            value.userName.SetNonNull();
            value.userName.Value() = chip::Span<const char>("xxxgarbage: not in length on purpose", 3);
            value.userUniqueId.SetNonNull();
            value.userUniqueId.Value() = 6452UL;
            value.userStatus.SetNonNull();
            value.userStatus.Value() = static_cast<chip::app::Clusters::DoorLock::DlUserStatus>(1);
            value.userType.SetNonNull();
            value.userType.Value() = static_cast<chip::app::Clusters::DoorLock::DlUserType>(0);
            value.credentialRule.SetNonNull();
            value.credentialRule.Value() = static_cast<chip::app::Clusters::DoorLock::DlCredentialRule>(0);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 10: {
            LogStep(10, "TH sends Get Year Day Schedule Command to DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.F0a && DRLK.S.C0f.Rsp && DRLK.S.C0f.Tx"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = NumberOfYearDaySchedulesSupportedPerUser;
            value.userIndex    = 5U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 11: {
            LogStep(11, "TH sends Clear Year Day Schedule to DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.C10.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "TH sends Get Year Day Schedule Command to DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.F0a && DRLK.S.C0f.Rsp && DRLK.S.C0f.Tx && DRLK.S.C10.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 13: {
            LogStep(13, "TH sends Set Year Day Schedule Command to DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.C0e.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetYearDaySchedule::Type value;
            value.yearDayIndex   = 1U;
            value.userIndex      = 1U;
            value.localStartTime = 1080UL;
            value.localEndTime   = 2100UL;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "TH sends Get Year Day Schedule Command to DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.F0a && DRLK.S.C0f.Rsp && DRLK.S.C0f.Tx"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 15: {
            LogStep(15, "TH sends Clear Year Day Schedule to DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.F0a && DRLK.S.C10.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearYearDaySchedule::Type value;
            value.yearDayIndex = 0U;
            value.userIndex    = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 16: {
            LogStep(16, "Clear a year day schedule for the first user");
            VerifyOrDo(!ShouldSkip("DRLK.S.F0a && DRLK.S.C10.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 17: {
            LogStep(17, "Cleanup the created user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearUser::Type value;
            value.userIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DRLK_2_9Suite : public TestCommand
{
public:
    Test_TC_DRLK_2_9Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DRLK_2_9", 21, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DRLK_2_9Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    uint16_t NumberOfTotalUsersSupported;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetUserResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValueNonNull("userName", value.userName));
                VerifyOrReturn(CheckValueAsString("userName.Value()", value.userName.Value(), chip::CharSpan("xxx", 3)));
                VerifyOrReturn(CheckValueNonNull("userUniqueId", value.userUniqueId));
                VerifyOrReturn(CheckValue("userUniqueId.Value()", value.userUniqueId.Value(), 6452UL));
                VerifyOrReturn(CheckValueNonNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValue("userStatus.Value()", value.userStatus.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("userType", value.userType));
                VerifyOrReturn(CheckValue("userType.Value()", value.userType.Value(), 0U));
                VerifyOrReturn(CheckValueNonNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValue("credentialRule.Value()", value.credentialRule.Value(), 0U));
                VerifyOrReturn(CheckValueNull("credentials", value.credentials));
                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValue("creatorFabricIndex.Value()", value.creatorFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValue("lastModifiedFabricIndex.Value()", value.lastModifiedFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65534U));
                NumberOfTotalUsersSupported = value;
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 2U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetCredentialStatusResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value.credentialExists", "boolean", "boolean"));
                VerifyOrReturn(CheckValueNonNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValue("userIndex.Value()", value.userIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValue("creatorFabricIndex.Value()", value.creatorFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValue("lastModifiedFabricIndex.Value()", value.lastModifiedFabricIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNull("nextCredentialIndex", value.nextCredentialIndex));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 133U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 3U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 2U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 3U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetCredentialStatusResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("credentialExists", value.credentialExists, false));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValueNull("nextCredentialIndex", value.nextCredentialIndex));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 2U));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetCredentialStatusResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("credentialExists", value.credentialExists, false));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValueNull("nextCredentialIndex", value.nextCredentialIndex));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetCredentialStatusResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("credentialExists", value.credentialExists, false));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValueNull("nextCredentialIndex", value.nextCredentialIndex));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Create new user with default parameters");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetUser::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);
            value.userIndex     = 1U;
            value.userName.SetNonNull();
            value.userName.Value() = chip::Span<const char>("xxxgarbage: not in length on purpose", 3);
            value.userUniqueId.SetNonNull();
            value.userUniqueId.Value() = 6452UL;
            value.userStatus.SetNonNull();
            value.userStatus.Value() = static_cast<chip::app::Clusters::DoorLock::DlUserStatus>(1);
            value.userType.SetNonNull();
            value.userType.Value() = static_cast<chip::app::Clusters::DoorLock::DlUserType>(0);
            value.credentialRule.SetNonNull();
            value.credentialRule.Value() = static_cast<chip::app::Clusters::DoorLock::DlCredentialRule>(0);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Read the user back and verify its fields");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "TH reads NumberOfTotalUsersSupported attribute and saves for future use.");
            VerifyOrDo(!ShouldSkip("DRLK.S.F08 && DRLK.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                 DoorLock::Attributes::NumberOfTotalUsersSupported::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH sends Set Credential Command to DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.F08 && DRLK.S.C22.Rsp && DRLK.S.C23.Tx"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 1U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("123456garbage: not in length on purpose"), 6);
            value.userIndex.SetNonNull();
            value.userIndex.Value() = 1U;
            value.userStatus.SetNull();
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "TH sends Get Credential Status Command");
            VerifyOrDo(!ShouldSkip("DRLK.S.F08 && DRLK.S.C24.Rsp && DRLK.S.C25.Tx"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 1U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "TH sends Set Credential Command to DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.F08 && DRLK.S.C22.Rsp && DRLK.S.C23.Tx"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 2U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("4321garbage: not in length on purpose"), 4);
            value.userIndex.SetNull();
            value.userStatus.SetNonNull();
            value.userStatus.Value() = static_cast<chip::app::Clusters::DoorLock::DlUserStatus>(5);
            value.userType.SetNonNull();
            value.userType.Value() = static_cast<chip::app::Clusters::DoorLock::DlUserType>(10);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "TH sends Set Credential Command to DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.F08 && DRLK.S.C22.Rsp && DRLK.S.C23.Tx"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 2U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("123456garbage: not in length on purpose"), 6);
            value.userIndex.SetNull();
            value.userStatus.SetNull();
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 8: {
            LogStep(8,
                    "TH sends Set Credential Command to DUT and Verify that the DUT sends Set Credential Response command with "
                    "status as DUPLICATE or OCCUPIED");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DRLK.S.F08 && DRLK.S.C22.Rsp && DRLK.S.C23.Tx"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9,
                    "TH sends Set Credential Command to DUT and Verify that the DUT sends Set Credential Response command with "
                    "response as OCCUPIED if the CredentialIndex is repeated");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DRLK.S.F08 && DRLK.S.C22.Rsp && DRLK.S.C23.Tx"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10,
                    "TH sends Set Credential Command to DUT and Verify that the DUT sends Set Credential Response command with "
                    "response as OCCUPIED if the CredentialIndex is repeated");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DRLK.S.F08 && DRLK.S.C22.Rsp && DRLK.S.C23.Tx"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 11: {
            LogStep(11, "TH sends Clear Credential Command to DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.F08 && DRLK.S.C26.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearCredential::Type value;
            value.credential.SetNonNull();

            value.credential.Value().credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.Value().credentialIndex = 1U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "TH sends Get Credential Status Command to DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.F08 && DRLK.S.C24.Rsp && DRLK.S.C25.Tx"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 1U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
                               chip::NullOptional

            );
        }
        case 13: {
            LogStep(13, "TH sends Set User Command to DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.F08 && DRLK.S.C1a.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetUser::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);
            value.userIndex     = 2U;
            value.userName.SetNonNull();
            value.userName.Value() = chip::Span<const char>("xxxgarbage: not in length on purpose", 3);
            value.userUniqueId.SetNonNull();
            value.userUniqueId.Value() = 6452UL;
            value.userStatus.SetNonNull();
            value.userStatus.Value() = static_cast<chip::app::Clusters::DoorLock::DlUserStatus>(1);
            value.userType.SetNonNull();
            value.userType.Value() = static_cast<chip::app::Clusters::DoorLock::DlUserType>(0);
            value.credentialRule.SetNonNull();
            value.credentialRule.Value() = static_cast<chip::app::Clusters::DoorLock::DlCredentialRule>(0);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "TH sends Set Credential Command to DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.F08 && DRLK.S.C22.Rsp && DRLK.S.C23.Tx"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DlDataOperationType>(0);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 1U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("123456garbage: not in length on purpose"), 6);
            value.userIndex.SetNonNull();
            value.userIndex.Value() = 2U;
            value.userStatus.SetNull();
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 15: {
            LogStep(15, "TH sends Clear Credential Command to DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.F08 && DRLK.S.C26.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearCredential::Type value;
            value.credential.SetNonNull();

            value.credential.Value().credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.Value().credentialIndex = 65534U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 16: {
            LogStep(16, "TH sends Get Credential Status Command");
            VerifyOrDo(!ShouldSkip("DRLK.S.F08 && DRLK.S.C24.Rsp && DRLK.S.C25.Tx"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 65534U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
                               chip::NullOptional

            );
        }
        case 17: {
            LogStep(17, "TH sends Get Credential Status Command");
            VerifyOrDo(!ShouldSkip("DRLK.S.F08 && DRLK.S.C24.Rsp && DRLK.S.C25.Tx"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(1);
            value.credential.credentialIndex = 1U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
                               chip::NullOptional

            );
        }
        case 18: {
            LogStep(18, "TH sends Clear Credential Command to DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.F08 && DRLK.S.C26.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearCredential::Type value;
            value.credential.SetNonNull();

            value.credential.Value().credentialType  = static_cast<chip::app::Clusters::DoorLock::DlCredentialType>(8);
            value.credential.Value().credentialIndex = 2U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 19: {
            LogStep(19, "Cleanup the first created user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearUser::Type value;
            value.userIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 20: {
            LogStep(20, "Cleanup the second created user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearUser::Type value;
            value.userIndex = 2U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestGroupMessagingSuite : public TestCommand
{
public:
    TestGroupMessagingSuite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("TestGroupMessaging", 41, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("nodeId2", 0, UINT64_MAX, &mNodeId2);
        AddArgument("discriminator", 0, UINT16_MAX, &mDiscriminator);
        AddArgument("payload", &mPayload);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestGroupMessagingSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<chip::NodeId> mNodeId2;
    chip::Optional<uint16_t> mDiscriminator;
    chip::Optional<chip::CharSpan> mPayload;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::AddGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValue("groupId", value.groupId, 257U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::AddGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValue("groupId", value.groupId, 258U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("nodeLabel", value, chip::CharSpan("", 0)));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("nodeLabel", value, chip::CharSpan("xyzzy", 5)));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("nodeLabel", value, chip::CharSpan("", 0)));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::AddGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValue("groupId", value.groupId, 257U));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::AddGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValue("groupId", value.groupId, 258U));
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("nodeLabel", value, chip::CharSpan("", 0)));
            }
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("nodeLabel", value, chip::CharSpan("xyzzy", 5)));
            }
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("nodeLabel", value, chip::CharSpan("", 0)));
            }
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "KeySet Write 1");
            ListFreer listFreer;
            chip::app::Clusters::GroupKeyManagement::Commands::KeySetWrite::Type value;

            value.groupKeySet.groupKeySetID = 417U;
            value.groupKeySet.groupKeySecurityPolicy =
                static_cast<chip::app::Clusters::GroupKeyManagement::GroupKeySecurityPolicy>(0);
            value.groupKeySet.epochKey0.SetNonNull();
            value.groupKeySet.epochKey0.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime0.SetNonNull();
            value.groupKeySet.epochStartTime0.Value() = 1110000ULL;
            value.groupKeySet.epochKey1.SetNonNull();
            value.groupKeySet.epochKey1.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime1.SetNonNull();
            value.groupKeySet.epochStartTime1.Value() = 1110001ULL;
            value.groupKeySet.epochKey2.SetNonNull();
            value.groupKeySet.epochKey2.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime2.SetNonNull();
            value.groupKeySet.epochStartTime2.Value() = 1110002ULL;

            return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                               GroupKeyManagement::Commands::KeySetWrite::Id, value, chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "KeySet Write 2");
            ListFreer listFreer;
            chip::app::Clusters::GroupKeyManagement::Commands::KeySetWrite::Type value;

            value.groupKeySet.groupKeySetID = 418U;
            value.groupKeySet.groupKeySecurityPolicy =
                static_cast<chip::app::Clusters::GroupKeyManagement::GroupKeySecurityPolicy>(0);
            value.groupKeySet.epochKey0.SetNonNull();
            value.groupKeySet.epochKey0.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime0.SetNonNull();
            value.groupKeySet.epochStartTime0.Value() = 2220000ULL;
            value.groupKeySet.epochKey1.SetNonNull();
            value.groupKeySet.epochKey1.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime1.SetNonNull();
            value.groupKeySet.epochStartTime1.Value() = 2220001ULL;
            value.groupKeySet.epochKey2.SetNonNull();
            value.groupKeySet.epochKey2.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime2.SetNonNull();
            value.groupKeySet.epochStartTime2.Value() = 2220002ULL;

            return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                               GroupKeyManagement::Commands::KeySetWrite::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "Write Group Keys");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].groupId       = 257U;
                listHolder_0->mList[0].groupKeySetID = 417U;
                listHolder_0->mList[0].fabricIndex   = 0U;

                listHolder_0->mList[1].groupId       = 258U;
                listHolder_0->mList[1].groupKeySetID = 418U;
                listHolder_0->mList[1].fabricIndex   = 0U;

                value = chip::app::DataModel::List<chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                                  GroupKeyManagement::Attributes::GroupKeyMap::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Add Group 1 (endpoint 1)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::AddGroup::Type value;
            value.groupId   = 257U;
            value.groupName = chip::Span<const char>("Group #1garbage: not in length on purpose", 8);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::AddGroup::Id, value, chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "Add Group 2 (endpoint 0)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::AddGroup::Type value;
            value.groupId   = 258U;
            value.groupName = chip::Span<const char>("Group #2garbage: not in length on purpose", 8);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), Groups::Id, Groups::Commands::AddGroup::Id, value, chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Install ACLs");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(5);
                listHolder_0->mList[0].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(2);
                listHolder_0->mList[0].subjects.SetNull();
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 0U;

                listHolder_0->mList[1].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(4);
                listHolder_0->mList[1].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(3);
                listHolder_0->mList[1].subjects.SetNull();
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = 0U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read initial Attribute value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::NodeLabel::Id, true,
                                 chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Group Write Attribute");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("xyzzygarbage: not in length on purpose", 5);
            return WriteGroupAttribute(kIdentityAlpha, 258, Basic::Id, Basic::Attributes::NodeLabel::Id, value, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Wait for write 1");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "Read back Attribute");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::NodeLabel::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Restore initial Attribute value");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("garbage: not in length on purpose", 0);
            return WriteGroupAttribute(kIdentityAlpha, 258, Basic::Id, Basic::Attributes::NodeLabel::Id, value, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Wait for write 2");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "Read back Attribute");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::NodeLabel::Id, true,
                                 chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Check on/off attribute value is false for endpoint 1");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Turn On the light to see attribute change");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendGroupCommand(kIdentityAlpha, 257, OnOff::Id, OnOff::Commands::On::Id, value);
        }
        case 16: {
            LogStep(16, "Wait for command 3");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17, "Check on/off attribute value is true after on command for endpoint 1");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Turn off the light to get ready for the next test");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 19: {
            LogStep(19, "Cleanup ACLs");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(5);
                listHolder_0->mList[0].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(2);
                listHolder_0->mList[0].subjects.SetNull();
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 0U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(
                    listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Open Commissioning Window from alpha");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 21: {
            LogStep(21, "Commission from gamma");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 1126240820ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityGamma, value);
        }
        case 22: {
            LogStep(22, "Wait for the commissioned device to be retrieved for gamma");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId2.HasValue() ? mNodeId2.Value() : 1126240820ULL;
            return WaitForCommissionee(kIdentityGamma, value);
        }
        case 23: {
            LogStep(23, "KeySet Write 1 for gamma");
            ListFreer listFreer;
            chip::app::Clusters::GroupKeyManagement::Commands::KeySetWrite::Type value;

            value.groupKeySet.groupKeySetID = 417U;
            value.groupKeySet.groupKeySecurityPolicy =
                static_cast<chip::app::Clusters::GroupKeyManagement::GroupKeySecurityPolicy>(0);
            value.groupKeySet.epochKey0.SetNonNull();
            value.groupKeySet.epochKey0.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime0.SetNonNull();
            value.groupKeySet.epochStartTime0.Value() = 1110000ULL;
            value.groupKeySet.epochKey1.SetNonNull();
            value.groupKeySet.epochKey1.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime1.SetNonNull();
            value.groupKeySet.epochStartTime1.Value() = 1110001ULL;
            value.groupKeySet.epochKey2.SetNonNull();
            value.groupKeySet.epochKey2.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime2.SetNonNull();
            value.groupKeySet.epochStartTime2.Value() = 1110002ULL;

            return SendCommand(kIdentityGamma, GetEndpoint(0), GroupKeyManagement::Id,
                               GroupKeyManagement::Commands::KeySetWrite::Id, value, chip::NullOptional

            );
        }
        case 24: {
            LogStep(24, "KeySet Write 2 for gamma");
            ListFreer listFreer;
            chip::app::Clusters::GroupKeyManagement::Commands::KeySetWrite::Type value;

            value.groupKeySet.groupKeySetID = 418U;
            value.groupKeySet.groupKeySecurityPolicy =
                static_cast<chip::app::Clusters::GroupKeyManagement::GroupKeySecurityPolicy>(0);
            value.groupKeySet.epochKey0.SetNonNull();
            value.groupKeySet.epochKey0.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime0.SetNonNull();
            value.groupKeySet.epochStartTime0.Value() = 2220000ULL;
            value.groupKeySet.epochKey1.SetNonNull();
            value.groupKeySet.epochKey1.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime1.SetNonNull();
            value.groupKeySet.epochStartTime1.Value() = 2220001ULL;
            value.groupKeySet.epochKey2.SetNonNull();
            value.groupKeySet.epochKey2.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime2.SetNonNull();
            value.groupKeySet.epochStartTime2.Value() = 2220002ULL;

            return SendCommand(kIdentityGamma, GetEndpoint(0), GroupKeyManagement::Id,
                               GroupKeyManagement::Commands::KeySetWrite::Id, value, chip::NullOptional

            );
        }
        case 25: {
            LogStep(25, "Write Group Keys for gamma");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].groupId       = 257U;
                listHolder_0->mList[0].groupKeySetID = 417U;
                listHolder_0->mList[0].fabricIndex   = 0U;

                listHolder_0->mList[1].groupId       = 258U;
                listHolder_0->mList[1].groupKeySetID = 418U;
                listHolder_0->mList[1].fabricIndex   = 0U;

                value = chip::app::DataModel::List<chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityGamma, GetEndpoint(0), GroupKeyManagement::Id,
                                  GroupKeyManagement::Attributes::GroupKeyMap::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 26: {
            LogStep(26, "Add Group 1 (endpoint 1) for gamma");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::AddGroup::Type value;
            value.groupId   = 257U;
            value.groupName = chip::Span<const char>("Group #1garbage: not in length on purpose", 8);
            return SendCommand(kIdentityGamma, GetEndpoint(1), Groups::Id, Groups::Commands::AddGroup::Id, value, chip::NullOptional

            );
        }
        case 27: {
            LogStep(27, "Add Group 2 (endpoint 0) for gamma");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::AddGroup::Type value;
            value.groupId   = 258U;
            value.groupName = chip::Span<const char>("Group #2garbage: not in length on purpose", 8);
            return SendCommand(kIdentityGamma, GetEndpoint(0), Groups::Id, Groups::Commands::AddGroup::Id, value, chip::NullOptional

            );
        }
        case 28: {
            LogStep(28, "Install ACLs for gamma");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(5);
                listHolder_0->mList[0].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(2);
                listHolder_0->mList[0].subjects.SetNull();
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 0U;

                listHolder_0->mList[1].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(4);
                listHolder_0->mList[1].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(3);
                listHolder_0->mList[1].subjects.SetNull();
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = 0U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityGamma, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 29: {
            LogStep(29, "Read initial Attribute value for gamma");
            return ReadAttribute(kIdentityGamma, GetEndpoint(0), Basic::Id, Basic::Attributes::NodeLabel::Id, true,
                                 chip::NullOptional);
        }
        case 30: {
            LogStep(30, "Group Write Attribute for gamma");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("xyzzygarbage: not in length on purpose", 5);
            return WriteGroupAttribute(kIdentityGamma, 258, Basic::Id, Basic::Attributes::NodeLabel::Id, value, chip::NullOptional);
        }
        case 31: {
            LogStep(31, "Wait for write 1 for gamma");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityGamma, value);
        }
        case 32: {
            LogStep(32, "Read back Attribute for gamma");
            return ReadAttribute(kIdentityGamma, GetEndpoint(0), Basic::Id, Basic::Attributes::NodeLabel::Id, true,
                                 chip::NullOptional);
        }
        case 33: {
            LogStep(33, "Restore initial Attribute value for gamma");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("garbage: not in length on purpose", 0);
            return WriteGroupAttribute(kIdentityGamma, 258, Basic::Id, Basic::Attributes::NodeLabel::Id, value, chip::NullOptional);
        }
        case 34: {
            LogStep(34, "Wait for write 2 for gamma");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityGamma, value);
        }
        case 35: {
            LogStep(35, "Read back Attribute for gamma");
            return ReadAttribute(kIdentityGamma, GetEndpoint(0), Basic::Id, Basic::Attributes::NodeLabel::Id, true,
                                 chip::NullOptional);
        }
        case 36: {
            LogStep(36, "Check on/off attribute value is false for endpoint 1 for gamma");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 37: {
            LogStep(37, "Turn On the light to see attribute change for gamma");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendGroupCommand(kIdentityGamma, 257, OnOff::Id, OnOff::Commands::On::Id, value);
        }
        case 38: {
            LogStep(38, "Wait for command 3 for gamma");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityGamma, value);
        }
        case 39: {
            LogStep(39, "Check on/off attribute value is true after on command for endpoint 1 for gamma");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 40: {
            LogStep(40, "Cleanup ACLs for gamma");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(5);
                listHolder_0->mList[0].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(2);
                listHolder_0->mList[0].subjects.SetNull();
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 0U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(
                    listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityGamma, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestGroupsClusterSuite : public TestCommand
{
public:
    TestGroupsClusterSuite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("TestGroupsCluster", 27, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestGroupsClusterSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::ViewGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 135U));
                VerifyOrReturn(CheckValue("groupId", value.groupId, 0U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::ViewGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
                VerifyOrReturn(CheckValue("groupId", value.groupId, 257U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::AddGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 126U));
                VerifyOrReturn(CheckValue("groupId", value.groupId, 257U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::AddGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValue("groupId", value.groupId, 257U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::ViewGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValue("groupId", value.groupId, 257U));
                VerifyOrReturn(CheckValueAsString("groupName", value.groupName, chip::CharSpan("Group #1", 8)));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::ViewGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
                VerifyOrReturn(CheckValue("groupId", value.groupId, 258U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::GetGroupMembershipResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("capacity", value.capacity));
                {
                    auto iter_0 = value.groupList.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.groupList)>("groupList", iter_0, 0));
                    VerifyOrReturn(CheckValue("groupList[0]", iter_0.GetValue(), 257U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.groupList)>("groupList", iter_0, 1));
                }
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::AddGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValue("groupId", value.groupId, 258U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::ViewGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValue("groupId", value.groupId, 258U));
                VerifyOrReturn(CheckValueAsString("groupName", value.groupName, chip::CharSpan("Group #2", 8)));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::ViewGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
                VerifyOrReturn(CheckValue("groupId", value.groupId, 32767U));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::ViewGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValue("groupId", value.groupId, 257U));
                VerifyOrReturn(CheckValueAsString("groupName", value.groupName, chip::CharSpan("Group #1", 8)));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::ViewGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValue("groupId", value.groupId, 258U));
                VerifyOrReturn(CheckValueAsString("groupName", value.groupName, chip::CharSpan("Group #2", 8)));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::GetGroupMembershipResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("capacity", value.capacity));
                {
                    auto iter_0 = value.groupList.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.groupList)>("groupList", iter_0, 0));
                    VerifyOrReturn(CheckValue("groupList[0]", iter_0.GetValue(), 258U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.groupList)>("groupList", iter_0, 1));
                }
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::RemoveGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 135U));
                VerifyOrReturn(CheckValue("groupId", value.groupId, 0U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::RemoveGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
                VerifyOrReturn(CheckValue("groupId", value.groupId, 260U));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::RemoveGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValue("groupId", value.groupId, 258U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::ViewGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValue("groupId", value.groupId, 257U));
                VerifyOrReturn(CheckValueAsString("groupName", value.groupName, chip::CharSpan("Group #1", 8)));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::ViewGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
                VerifyOrReturn(CheckValue("groupId", value.groupId, 258U));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::GetGroupMembershipResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("capacity", value.capacity));
                {
                    auto iter_0 = value.groupList.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.groupList)>("groupList", iter_0, 0));
                    VerifyOrReturn(CheckValue("groupList[0]", iter_0.GetValue(), 257U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.groupList)>("groupList", iter_0, 1));
                }
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::ViewGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
                VerifyOrReturn(CheckValue("groupId", value.groupId, 257U));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::ViewGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
                VerifyOrReturn(CheckValue("groupId", value.groupId, 258U));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::ViewGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
                VerifyOrReturn(CheckValue("groupId", value.groupId, 32767U));
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::GetGroupMembershipResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("capacity", value.capacity));
                {
                    auto iter_0 = value.groupList.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.groupList)>("groupList", iter_0, 0));
                }
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "View Group 0 (invalid)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::ViewGroup::Type value;
            value.groupId = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::ViewGroup::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "View First Group (not found)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::ViewGroup::Type value;
            value.groupId = 257U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::ViewGroup::Id, value,
                               chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "Add First Group (no keys)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::AddGroup::Type value;
            value.groupId   = 257U;
            value.groupName = chip::Span<const char>("Group #1garbage: not in length on purpose", 8);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::AddGroup::Id, value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Add KeySet");
            ListFreer listFreer;
            chip::app::Clusters::GroupKeyManagement::Commands::KeySetWrite::Type value;

            value.groupKeySet.groupKeySetID = 417U;
            value.groupKeySet.groupKeySecurityPolicy =
                static_cast<chip::app::Clusters::GroupKeyManagement::GroupKeySecurityPolicy>(0);
            value.groupKeySet.epochKey0.SetNonNull();
            value.groupKeySet.epochKey0.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime0.SetNonNull();
            value.groupKeySet.epochStartTime0.Value() = 1110000ULL;
            value.groupKeySet.epochKey1.SetNonNull();
            value.groupKeySet.epochKey1.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime1.SetNonNull();
            value.groupKeySet.epochStartTime1.Value() = 1110001ULL;
            value.groupKeySet.epochKey2.SetNonNull();
            value.groupKeySet.epochKey2.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime2.SetNonNull();
            value.groupKeySet.epochStartTime2.Value() = 1110002ULL;

            return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                               GroupKeyManagement::Commands::KeySetWrite::Id, value, chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "Write Group Keys");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].groupId       = 257U;
                listHolder_0->mList[0].groupKeySetID = 417U;
                listHolder_0->mList[0].fabricIndex   = 1U;

                listHolder_0->mList[1].groupId       = 258U;
                listHolder_0->mList[1].groupKeySetID = 417U;
                listHolder_0->mList[1].fabricIndex   = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                                  GroupKeyManagement::Attributes::GroupKeyMap::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Add First Group (new)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::AddGroup::Type value;
            value.groupId   = 257U;
            value.groupName = chip::Span<const char>("Group #1garbage: not in length on purpose", 8);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::AddGroup::Id, value, chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "View First Group (new)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::ViewGroup::Type value;
            value.groupId = 257U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::ViewGroup::Id, value,
                               chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "View Second Group (not found)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::ViewGroup::Type value;
            value.groupId = 258U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::ViewGroup::Id, value,
                               chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "Get Group Membership 1 (all)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::GetGroupMembership::Type value;

            value.groupList = chip::app::DataModel::List<chip::GroupId>();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::GetGroupMembership::Id, value,
                               chip::NullOptional

            );
        }
        case 10: {
            LogStep(10, "Add Second Group (new)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::AddGroup::Type value;
            value.groupId   = 258U;
            value.groupName = chip::Span<const char>("Group #2garbage: not in length on purpose", 8);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::AddGroup::Id, value, chip::NullOptional

            );
        }
        case 11: {
            LogStep(11, "View Second Group (new)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::ViewGroup::Type value;
            value.groupId = 258U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::ViewGroup::Id, value,
                               chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "View Group 3 (not found)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::ViewGroup::Type value;
            value.groupId = 32767U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::ViewGroup::Id, value,
                               chip::NullOptional

            );
        }
        case 13: {
            LogStep(13, "View First Group (existing)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::ViewGroup::Type value;
            value.groupId = 257U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::ViewGroup::Id, value,
                               chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "View Second Group (existing)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::ViewGroup::Type value;
            value.groupId = 258U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::ViewGroup::Id, value,
                               chip::NullOptional

            );
        }
        case 15: {
            LogStep(15, "Get Group Membership 2");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::GetGroupMembership::Type value;

            {
                auto * listHolder_0 = new ListHolder<chip::GroupId>(3);
                listFreer.add(listHolder_0);
                listHolder_0->mList[0] = 258U;
                listHolder_0->mList[1] = 259U;
                listHolder_0->mList[2] = 32767U;
                value.groupList        = chip::app::DataModel::List<chip::GroupId>(listHolder_0->mList, 3);
            }
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::GetGroupMembership::Id, value,
                               chip::NullOptional

            );
        }
        case 16: {
            LogStep(16, "Remove Group 0 (invalid)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::RemoveGroup::Type value;
            value.groupId = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::RemoveGroup::Id, value,
                               chip::NullOptional

            );
        }
        case 17: {
            LogStep(17, "Remove Group 4 (not found)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::RemoveGroup::Type value;
            value.groupId = 260U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::RemoveGroup::Id, value,
                               chip::NullOptional

            );
        }
        case 18: {
            LogStep(18, "Remove Second Group (existing)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::RemoveGroup::Type value;
            value.groupId = 258U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::RemoveGroup::Id, value,
                               chip::NullOptional

            );
        }
        case 19: {
            LogStep(19, "View First Group (not removed)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::ViewGroup::Type value;
            value.groupId = 257U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::ViewGroup::Id, value,
                               chip::NullOptional

            );
        }
        case 20: {
            LogStep(20, "View Second Group (removed)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::ViewGroup::Type value;
            value.groupId = 258U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::ViewGroup::Id, value,
                               chip::NullOptional

            );
        }
        case 21: {
            LogStep(21, "Get Group Membership 3");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::GetGroupMembership::Type value;

            {
                auto * listHolder_0 = new ListHolder<chip::GroupId>(4);
                listFreer.add(listHolder_0);
                listHolder_0->mList[0] = 1U;
                listHolder_0->mList[1] = 257U;
                listHolder_0->mList[2] = 258U;
                listHolder_0->mList[3] = 3U;
                value.groupList        = chip::app::DataModel::List<chip::GroupId>(listHolder_0->mList, 4);
            }
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::GetGroupMembership::Id, value,
                               chip::NullOptional

            );
        }
        case 22: {
            LogStep(22, "Remove All");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::RemoveAllGroups::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::RemoveAllGroups::Id, value,
                               chip::NullOptional

            );
        }
        case 23: {
            LogStep(23, "View First Group (removed)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::ViewGroup::Type value;
            value.groupId = 257U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::ViewGroup::Id, value,
                               chip::NullOptional

            );
        }
        case 24: {
            LogStep(24, "View Second Group (still removed)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::ViewGroup::Type value;
            value.groupId = 258U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::ViewGroup::Id, value,
                               chip::NullOptional

            );
        }
        case 25: {
            LogStep(25, "View Group 3 (removed)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::ViewGroup::Type value;
            value.groupId = 32767U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::ViewGroup::Id, value,
                               chip::NullOptional

            );
        }
        case 26: {
            LogStep(26, "Get Group Membership 4");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::GetGroupMembership::Type value;

            {
                auto * listHolder_0 = new ListHolder<chip::GroupId>(5);
                listFreer.add(listHolder_0);
                listHolder_0->mList[0] = 1U;
                listHolder_0->mList[1] = 257U;
                listHolder_0->mList[2] = 258U;
                listHolder_0->mList[3] = 3U;
                listHolder_0->mList[4] = 32767U;
                value.groupList        = chip::app::DataModel::List<chip::GroupId>(listHolder_0->mList, 5);
            }
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::GetGroupMembership::Id, value,
                               chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestGroupKeyManagementClusterSuite : public TestCommand
{
public:
    TestGroupKeyManagementClusterSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestGroupKeyManagementCluster", 22, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestGroupKeyManagementClusterSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 2U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 3U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::GroupKeyManagement::Commands::KeySetReadResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("groupKeySet.groupKeySetID", value.groupKeySet.groupKeySetID, 417U));
                VerifyOrReturn(CheckValue("groupKeySet.groupKeySecurityPolicy", value.groupKeySet.groupKeySecurityPolicy, 0U));
                VerifyOrReturn(CheckValueNull("groupKeySet.epochKey0", value.groupKeySet.epochKey0));
                VerifyOrReturn(CheckValueNonNull("groupKeySet.epochStartTime0", value.groupKeySet.epochStartTime0));
                VerifyOrReturn(
                    CheckValue("groupKeySet.epochStartTime0.Value()", value.groupKeySet.epochStartTime0.Value(), 1110000ULL));
                VerifyOrReturn(CheckValueNull("groupKeySet.epochKey1", value.groupKeySet.epochKey1));
                VerifyOrReturn(CheckValueNonNull("groupKeySet.epochStartTime1", value.groupKeySet.epochStartTime1));
                VerifyOrReturn(
                    CheckValue("groupKeySet.epochStartTime1.Value()", value.groupKeySet.epochStartTime1.Value(), 1110001ULL));
                VerifyOrReturn(CheckValueNull("groupKeySet.epochKey2", value.groupKeySet.epochKey2));
                VerifyOrReturn(CheckValueNonNull("groupKeySet.epochStartTime2", value.groupKeySet.epochStartTime2));
                VerifyOrReturn(
                    CheckValue("groupKeySet.epochStartTime2.Value()", value.groupKeySet.epochStartTime2.Value(), 1110002ULL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupKeyMap", iter_0, 0));
                    VerifyOrReturn(CheckValue("groupKeyMap[0].groupId", iter_0.GetValue().groupId, 257U));
                    VerifyOrReturn(CheckValue("groupKeyMap[0].groupKeySetID", iter_0.GetValue().groupKeySetID, 417U));
                    VerifyOrReturn(CheckValue("groupKeyMap[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupKeyMap", iter_0, 1));
                    VerifyOrReturn(CheckValue("groupKeyMap[1].groupId", iter_0.GetValue().groupId, 258U));
                    VerifyOrReturn(CheckValue("groupKeyMap[1].groupKeySetID", iter_0.GetValue().groupKeySetID, 417U));
                    VerifyOrReturn(CheckValue("groupKeyMap[1].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupKeyMap", iter_0, 2));
                    VerifyOrReturn(CheckValue("groupKeyMap[2].groupId", iter_0.GetValue().groupId, 258U));
                    VerifyOrReturn(CheckValue("groupKeyMap[2].groupKeySetID", iter_0.GetValue().groupKeySetID, 418U));
                    VerifyOrReturn(CheckValue("groupKeyMap[2].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("groupKeyMap", iter_0, 3));
                }
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::AddGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValue("groupId", value.groupId, 257U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::AddGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValue("groupId", value.groupId, 258U));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::GroupKeyManagement::Structs::GroupInfoMapStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupTable", iter_0, 0));
                    VerifyOrReturn(CheckValue("groupTable[0].groupId", iter_0.GetValue().groupId, 257U));
                    VerifyOrReturn(CheckValuePresent("groupTable[0].groupName", iter_0.GetValue().groupName));
                    VerifyOrReturn(CheckValueAsString("groupTable[0].groupName.Value()", iter_0.GetValue().groupName.Value(),
                                                      chip::CharSpan("Group #1", 8)));
                    VerifyOrReturn(CheckValue("groupTable[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupTable", iter_0, 1));
                    VerifyOrReturn(CheckValue("groupTable[1].groupId", iter_0.GetValue().groupId, 258U));
                    VerifyOrReturn(CheckValuePresent("groupTable[1].groupName", iter_0.GetValue().groupName));
                    VerifyOrReturn(CheckValueAsString("groupTable[1].groupName.Value()", iter_0.GetValue().groupName.Value(),
                                                      chip::CharSpan("Group #2", 8)));
                    VerifyOrReturn(CheckValue("groupTable[1].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("groupTable", iter_0, 2));
                }
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_NOT_FOUND));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::GroupKeyManagement::Commands::KeySetReadResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("groupKeySet.groupKeySetID", value.groupKeySet.groupKeySetID, 418U));
                VerifyOrReturn(CheckValue("groupKeySet.groupKeySecurityPolicy", value.groupKeySet.groupKeySecurityPolicy, 1U));
                VerifyOrReturn(CheckValueNull("groupKeySet.epochKey0", value.groupKeySet.epochKey0));
                VerifyOrReturn(CheckValueNonNull("groupKeySet.epochStartTime0", value.groupKeySet.epochStartTime0));
                VerifyOrReturn(
                    CheckValue("groupKeySet.epochStartTime0.Value()", value.groupKeySet.epochStartTime0.Value(), 2110000ULL));
                VerifyOrReturn(CheckValueNull("groupKeySet.epochKey1", value.groupKeySet.epochKey1));
                VerifyOrReturn(CheckValueNonNull("groupKeySet.epochStartTime1", value.groupKeySet.epochStartTime1));
                VerifyOrReturn(
                    CheckValue("groupKeySet.epochStartTime1.Value()", value.groupKeySet.epochStartTime1.Value(), 2110001ULL));
                VerifyOrReturn(CheckValueNull("groupKeySet.epochKey2", value.groupKeySet.epochKey2));
                VerifyOrReturn(CheckValueNonNull("groupKeySet.epochStartTime2", value.groupKeySet.epochStartTime2));
                VerifyOrReturn(
                    CheckValue("groupKeySet.epochStartTime2.Value()", value.groupKeySet.epochStartTime2.Value(), 2110002ULL));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::RemoveGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValue("groupId", value.groupId, 257U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::GroupKeyManagement::Structs::GroupInfoMapStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupTable", iter_0, 0));
                    VerifyOrReturn(CheckValue("groupTable[0].groupId", iter_0.GetValue().groupId, 258U));
                    VerifyOrReturn(CheckValuePresent("groupTable[0].groupName", iter_0.GetValue().groupName));
                    VerifyOrReturn(CheckValueAsString("groupTable[0].groupName.Value()", iter_0.GetValue().groupName.Value(),
                                                      chip::CharSpan("Group #2", 8)));
                    VerifyOrReturn(CheckValue("groupTable[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("groupTable", iter_0, 1));
                }
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::GroupKeyManagement::Structs::GroupInfoMapStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("groupTable", iter_0, 0));
                }
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_NOT_FOUND));
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read maxGroupsPerFabric");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                                 GroupKeyManagement::Attributes::MaxGroupsPerFabric::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read maxGroupKeysPerFabric");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                                 GroupKeyManagement::Attributes::MaxGroupKeysPerFabric::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "KeySet Write 1");
            ListFreer listFreer;
            chip::app::Clusters::GroupKeyManagement::Commands::KeySetWrite::Type value;

            value.groupKeySet.groupKeySetID = 417U;
            value.groupKeySet.groupKeySecurityPolicy =
                static_cast<chip::app::Clusters::GroupKeyManagement::GroupKeySecurityPolicy>(0);
            value.groupKeySet.epochKey0.SetNonNull();
            value.groupKeySet.epochKey0.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime0.SetNonNull();
            value.groupKeySet.epochStartTime0.Value() = 1110000ULL;
            value.groupKeySet.epochKey1.SetNonNull();
            value.groupKeySet.epochKey1.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime1.SetNonNull();
            value.groupKeySet.epochStartTime1.Value() = 1110001ULL;
            value.groupKeySet.epochKey2.SetNonNull();
            value.groupKeySet.epochKey2.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime2.SetNonNull();
            value.groupKeySet.epochStartTime2.Value() = 1110002ULL;

            return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                               GroupKeyManagement::Commands::KeySetWrite::Id, value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "KeySet Write 2");
            ListFreer listFreer;
            chip::app::Clusters::GroupKeyManagement::Commands::KeySetWrite::Type value;

            value.groupKeySet.groupKeySetID = 418U;
            value.groupKeySet.groupKeySecurityPolicy =
                static_cast<chip::app::Clusters::GroupKeyManagement::GroupKeySecurityPolicy>(1);
            value.groupKeySet.epochKey0.SetNonNull();
            value.groupKeySet.epochKey0.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime0.SetNonNull();
            value.groupKeySet.epochStartTime0.Value() = 2110000ULL;
            value.groupKeySet.epochKey1.SetNonNull();
            value.groupKeySet.epochKey1.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime1.SetNonNull();
            value.groupKeySet.epochStartTime1.Value() = 2110001ULL;
            value.groupKeySet.epochKey2.SetNonNull();
            value.groupKeySet.epochKey2.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime2.SetNonNull();
            value.groupKeySet.epochStartTime2.Value() = 2110002ULL;

            return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                               GroupKeyManagement::Commands::KeySetWrite::Id, value, chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "KeySet Read");
            ListFreer listFreer;
            chip::app::Clusters::GroupKeyManagement::Commands::KeySetRead::Type value;
            value.groupKeySetID = 417U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id, GroupKeyManagement::Commands::KeySetRead::Id,
                               value, chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Write Group Keys (invalid)");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].groupId       = 258U;
                listHolder_0->mList[0].groupKeySetID = 0U;
                listHolder_0->mList[0].fabricIndex   = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type>(
                    listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                                  GroupKeyManagement::Attributes::GroupKeyMap::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Write Group Keys (too many)");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type>(4);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].groupId       = 257U;
                listHolder_0->mList[0].groupKeySetID = 417U;
                listHolder_0->mList[0].fabricIndex   = 1U;

                listHolder_0->mList[1].groupId       = 257U;
                listHolder_0->mList[1].groupKeySetID = 418U;
                listHolder_0->mList[1].fabricIndex   = 1U;

                listHolder_0->mList[2].groupId       = 258U;
                listHolder_0->mList[2].groupKeySetID = 417U;
                listHolder_0->mList[2].fabricIndex   = 1U;

                listHolder_0->mList[3].groupId       = 258U;
                listHolder_0->mList[3].groupKeySetID = 418U;
                listHolder_0->mList[3].fabricIndex   = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type>(
                    listHolder_0->mList, 4);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                                  GroupKeyManagement::Attributes::GroupKeyMap::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Write Group Keys");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type>(3);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].groupId       = 257U;
                listHolder_0->mList[0].groupKeySetID = 417U;
                listHolder_0->mList[0].fabricIndex   = 1U;

                listHolder_0->mList[1].groupId       = 258U;
                listHolder_0->mList[1].groupKeySetID = 417U;
                listHolder_0->mList[1].fabricIndex   = 1U;

                listHolder_0->mList[2].groupId       = 258U;
                listHolder_0->mList[2].groupKeySetID = 418U;
                listHolder_0->mList[2].fabricIndex   = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type>(
                    listHolder_0->mList, 3);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                                  GroupKeyManagement::Attributes::GroupKeyMap::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Read Group Keys");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                                 GroupKeyManagement::Attributes::GroupKeyMap::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Add Group 1");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::AddGroup::Type value;
            value.groupId   = 257U;
            value.groupName = chip::Span<const char>("Group #1garbage: not in length on purpose", 8);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::AddGroup::Id, value, chip::NullOptional

            );
        }
        case 11: {
            LogStep(11, "Add Group 2");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::AddGroup::Type value;
            value.groupId   = 258U;
            value.groupName = chip::Span<const char>("Group #2garbage: not in length on purpose", 8);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::AddGroup::Id, value, chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "Read GroupTable");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                                 GroupKeyManagement::Attributes::GroupTable::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "KeySet Remove 1");
            ListFreer listFreer;
            chip::app::Clusters::GroupKeyManagement::Commands::KeySetRemove::Type value;
            value.groupKeySetID = 417U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                               GroupKeyManagement::Commands::KeySetRemove::Id, value, chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "KeySet Read (removed)");
            ListFreer listFreer;
            chip::app::Clusters::GroupKeyManagement::Commands::KeySetRead::Type value;
            value.groupKeySetID = 417U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id, GroupKeyManagement::Commands::KeySetRead::Id,
                               value, chip::NullOptional

            );
        }
        case 15: {
            LogStep(15, "KeySet Read (not removed)");
            ListFreer listFreer;
            chip::app::Clusters::GroupKeyManagement::Commands::KeySetRead::Type value;
            value.groupKeySetID = 418U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id, GroupKeyManagement::Commands::KeySetRead::Id,
                               value, chip::NullOptional

            );
        }
        case 16: {
            LogStep(16, "Remove Group 1");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::RemoveGroup::Type value;
            value.groupId = 257U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::RemoveGroup::Id, value,
                               chip::NullOptional

            );
        }
        case 17: {
            LogStep(17, "Read GroupTable 2");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                                 GroupKeyManagement::Attributes::GroupTable::Id, true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Remove All");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::RemoveAllGroups::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::RemoveAllGroups::Id, value,
                               chip::NullOptional

            );
        }
        case 19: {
            LogStep(19, "Read GroupTable 3");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                                 GroupKeyManagement::Attributes::GroupTable::Id, true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "KeySet Remove 2");
            ListFreer listFreer;
            chip::app::Clusters::GroupKeyManagement::Commands::KeySetRemove::Type value;
            value.groupKeySetID = 418U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                               GroupKeyManagement::Commands::KeySetRemove::Id, value, chip::NullOptional

            );
        }
        case 21: {
            LogStep(21, "KeySet Read (also removed)");
            ListFreer listFreer;
            chip::app::Clusters::GroupKeyManagement::Commands::KeySetRead::Type value;
            value.groupKeySetID = 418U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id, GroupKeyManagement::Commands::KeySetRead::Id,
                               value, chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_G_1_1Suite : public TestCommand
{
public:
    Test_TC_G_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_G_1_1", 7, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_G_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 4U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH reads the ClusterRevision from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Attributes::ClusterRevision::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads the FeatureMap from DUT");
            VerifyOrDo(!ShouldSkip(" !G.S.F00 "), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Given G.S.F00 ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("G.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads AttributeList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads AcceptedCommandList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH reads GeneratedCommandList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Attributes::GeneratedCommandList::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_G_2_1Suite : public TestCommand
{
public:
    Test_TC_G_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_G_2_1", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_G_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    uint8_t NameSupportFeatureSupportedValue;
    uint8_t NameSupportValue;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("nameSupport", value, 128U));
                NameSupportFeatureSupportedValue = value;
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("nameSupport", value, 0U));
                NameSupportValue = value;
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("nameSupport", value, NameSupportFeatureSupportedValue));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("nameSupport", value, NameSupportValue));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH reads NameSupport attribute from DUT");
            VerifyOrDo(!ShouldSkip("G.S.A0000 && G.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Attributes::NameSupport::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads NameSupport attribute from DUT");
            VerifyOrDo(!ShouldSkip("G.S.A0000 && !G.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Attributes::NameSupport::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH writes NameSupport attribute as 0x80 EXOR the value as read in step 1");
            VerifyOrDo(!ShouldSkip("G.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 128U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Attributes::NameSupport::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads NameSupport attribute from DUT");
            VerifyOrDo(!ShouldSkip("G.S.A0000 && G.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Attributes::NameSupport::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads NameSupport attribute from DUT");
            VerifyOrDo(!ShouldSkip("G.S.A0000 && !G.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Attributes::NameSupport::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_1_5Suite : public TestCommand
{
public:
    Test_TC_DD_1_5Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_1_5", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_1_5Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_1_6Suite : public TestCommand
{
public:
    Test_TC_DD_1_6Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_1_6", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_1_6Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_1_7Suite : public TestCommand
{
public:
    Test_TC_DD_1_7Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_1_7", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_1_7Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_1_8Suite : public TestCommand
{
public:
    Test_TC_DD_1_8Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_1_8", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_1_8Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_1_9Suite : public TestCommand
{
public:
    Test_TC_DD_1_9Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_1_9", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_1_9Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_1_10Suite : public TestCommand
{
public:
    Test_TC_DD_1_10Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_1_10", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_1_10Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_1_11Suite : public TestCommand
{
public:
    Test_TC_DD_1_11Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_1_11", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_1_11Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_1_12Suite : public TestCommand
{
public:
    Test_TC_DD_1_12Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_1_12", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_1_12Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_1_13Suite : public TestCommand
{
public:
    Test_TC_DD_1_13Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_1_13", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_1_13Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_1_14Suite : public TestCommand
{
public:
    Test_TC_DD_1_14Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_1_14", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_1_14Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_1_15Suite : public TestCommand
{
public:
    Test_TC_DD_1_15Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_1_15", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_1_15Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_2_1Suite : public TestCommand
{
public:
    Test_TC_DD_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_2_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_2_2Suite : public TestCommand
{
public:
    Test_TC_DD_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_2_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_3_1Suite : public TestCommand
{
public:
    Test_TC_DD_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_3_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_3_2Suite : public TestCommand
{
public:
    Test_TC_DD_3_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_3_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_3_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_3_3Suite : public TestCommand
{
public:
    Test_TC_DD_3_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_3_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_3_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_3_4Suite : public TestCommand
{
public:
    Test_TC_DD_3_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_3_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_3_4Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_3_5Suite : public TestCommand
{
public:
    Test_TC_DD_3_5Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_3_5", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_3_5Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_3_6Suite : public TestCommand
{
public:
    Test_TC_DD_3_6Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_3_6", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_3_6Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_3_7Suite : public TestCommand
{
public:
    Test_TC_DD_3_7Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_3_7", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_3_7Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_3_8Suite : public TestCommand
{
public:
    Test_TC_DD_3_8Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_3_8", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_3_8Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_3_9Suite : public TestCommand
{
public:
    Test_TC_DD_3_9Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_3_9", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_3_9Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_3_10Suite : public TestCommand
{
public:
    Test_TC_DD_3_10Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_3_10", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_3_10Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_3_11Suite : public TestCommand
{
public:
    Test_TC_DD_3_11Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_3_11", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_3_11Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_3_12Suite : public TestCommand
{
public:
    Test_TC_DD_3_12Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_3_12", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_3_12Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_3_13Suite : public TestCommand
{
public:
    Test_TC_DD_3_13Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_3_13", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_3_13Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_3_14Suite : public TestCommand
{
public:
    Test_TC_DD_3_14Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_3_14", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_3_14Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_3_15Suite : public TestCommand
{
public:
    Test_TC_DD_3_15Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_3_15", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_3_15Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_3_16Suite : public TestCommand
{
public:
    Test_TC_DD_3_16Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_3_16", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_3_16Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_3_17Suite : public TestCommand
{
public:
    Test_TC_DD_3_17Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_3_17", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_3_17Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_3_18Suite : public TestCommand
{
public:
    Test_TC_DD_3_18Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_3_18", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_3_18Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_3_19Suite : public TestCommand
{
public:
    Test_TC_DD_3_19Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_3_19", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_3_19Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_3_20Suite : public TestCommand
{
public:
    Test_TC_DD_3_20Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_3_20", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_3_20Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_3_21Suite : public TestCommand
{
public:
    Test_TC_DD_3_21Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_3_21", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_3_21Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class TestGroupDemoCommandSuite : public TestCommand
{
public:
    TestGroupDemoCommandSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestGroupDemoCommand", 21, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestGroupDemoCommandSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Turn On the light to see attribute change");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendGroupCommand(kIdentityAlpha, 257, OnOff::Id, OnOff::Commands::On::Id, value);
        }
        case 2: {
            LogStep(2, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "Turn Off the light to see attribute change");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendGroupCommand(kIdentityAlpha, 257, OnOff::Id, OnOff::Commands::Off::Id, value);
        }
        case 4: {
            LogStep(4, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "Turn On the light to see attribute change");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendGroupCommand(kIdentityAlpha, 257, OnOff::Id, OnOff::Commands::On::Id, value);
        }
        case 6: {
            LogStep(6, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "Turn Off the light to see attribute change");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendGroupCommand(kIdentityAlpha, 257, OnOff::Id, OnOff::Commands::Off::Id, value);
        }
        case 8: {
            LogStep(8, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "Turn On the light to see attribute change");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendGroupCommand(kIdentityAlpha, 257, OnOff::Id, OnOff::Commands::On::Id, value);
        }
        case 10: {
            LogStep(10, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 11: {
            LogStep(11, "Turn Off the light to see attribute change");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendGroupCommand(kIdentityAlpha, 257, OnOff::Id, OnOff::Commands::Off::Id, value);
        }
        case 12: {
            LogStep(12, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "Turn On the light to see attribute change");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendGroupCommand(kIdentityAlpha, 257, OnOff::Id, OnOff::Commands::On::Id, value);
        }
        case 14: {
            LogStep(14, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 15: {
            LogStep(15, "Turn Off the light to see attribute change");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendGroupCommand(kIdentityAlpha, 257, OnOff::Id, OnOff::Commands::Off::Id, value);
        }
        case 16: {
            LogStep(16, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17, "Turn On the light to see attribute change");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendGroupCommand(kIdentityAlpha, 257, OnOff::Id, OnOff::Commands::On::Id, value);
        }
        case 18: {
            LogStep(18, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 19: {
            LogStep(19, "Turn Off the light to see attribute change");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendGroupCommand(kIdentityAlpha, 257, OnOff::Id, OnOff::Commands::Off::Id, value);
        }
        case 20: {
            LogStep(20, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestGroupDemoConfigSuite : public TestCommand
{
public:
    TestGroupDemoConfigSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestGroupDemoConfig", 5, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestGroupDemoConfigSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::AddGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValue("groupId", value.groupId, 257U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "KeySet Write 1 (endpoint 0)");
            ListFreer listFreer;
            chip::app::Clusters::GroupKeyManagement::Commands::KeySetWrite::Type value;

            value.groupKeySet.groupKeySetID = 417U;
            value.groupKeySet.groupKeySecurityPolicy =
                static_cast<chip::app::Clusters::GroupKeyManagement::GroupKeySecurityPolicy>(0);
            value.groupKeySet.epochKey0.SetNonNull();
            value.groupKeySet.epochKey0.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime0.SetNonNull();
            value.groupKeySet.epochStartTime0.Value() = 1110000ULL;
            value.groupKeySet.epochKey1.SetNonNull();
            value.groupKeySet.epochKey1.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime1.SetNonNull();
            value.groupKeySet.epochStartTime1.Value() = 1110001ULL;
            value.groupKeySet.epochKey2.SetNonNull();
            value.groupKeySet.epochKey2.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime2.SetNonNull();
            value.groupKeySet.epochStartTime2.Value() = 1110002ULL;

            return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                               GroupKeyManagement::Commands::KeySetWrite::Id, value, chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Write Group Keys (endpoint 0)");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].groupId       = 257U;
                listHolder_0->mList[0].groupKeySetID = 417U;
                listHolder_0->mList[0].fabricIndex   = 0U;

                value = chip::app::DataModel::List<chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type>(
                    listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                                  GroupKeyManagement::Attributes::GroupKeyMap::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Add Group 1 (endpoint 1)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::AddGroup::Type value;
            value.groupId   = 257U;
            value.groupName = chip::Span<const char>("Group #1garbage: not in length on purpose", 8);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::AddGroup::Id, value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Install ACLs");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(5);
                listHolder_0->mList[0].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(2);
                listHolder_0->mList[0].subjects.SetNull();
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 1U;

                listHolder_0->mList[1].privilege = static_cast<chip::app::Clusters::AccessControl::Privilege>(3);
                listHolder_0->mList[1].authMode  = static_cast<chip::app::Clusters::AccessControl::AuthMode>(3);
                listHolder_0->mList[1].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 257ULL;
                    listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_G_2_2Suite : public TestCommand
{
public:
    Test_TC_G_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_G_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_G_2_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_G_2_3Suite : public TestCommand
{
public:
    Test_TC_G_2_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_G_2_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_G_2_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_G_3_1Suite : public TestCommand
{
public:
    Test_TC_G_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_G_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_G_3_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_G_3_2Suite : public TestCommand
{
public:
    Test_TC_G_3_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_G_3_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_G_3_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BDX_1_1Suite : public TestCommand
{
public:
    Test_TC_BDX_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BDX_1_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BDX_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BDX_1_2Suite : public TestCommand
{
public:
    Test_TC_BDX_1_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BDX_1_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BDX_1_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BDX_1_3Suite : public TestCommand
{
public:
    Test_TC_BDX_1_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BDX_1_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BDX_1_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BDX_1_4Suite : public TestCommand
{
public:
    Test_TC_BDX_1_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BDX_1_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BDX_1_4Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BDX_1_5Suite : public TestCommand
{
public:
    Test_TC_BDX_1_5Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BDX_1_5", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BDX_1_5Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BDX_1_6Suite : public TestCommand
{
public:
    Test_TC_BDX_1_6Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BDX_1_6", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BDX_1_6Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BDX_2_1Suite : public TestCommand
{
public:
    Test_TC_BDX_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BDX_2_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BDX_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BDX_2_2Suite : public TestCommand
{
public:
    Test_TC_BDX_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BDX_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BDX_2_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BDX_2_3Suite : public TestCommand
{
public:
    Test_TC_BDX_2_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BDX_2_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BDX_2_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BDX_2_4Suite : public TestCommand
{
public:
    Test_TC_BDX_2_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BDX_2_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BDX_2_4Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BDX_2_5Suite : public TestCommand
{
public:
    Test_TC_BDX_2_5Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BDX_2_5", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BDX_2_5Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BR_1Suite : public TestCommand
{
public:
    Test_TC_BR_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BR_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BR_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BR_2Suite : public TestCommand
{
public:
    Test_TC_BR_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BR_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BR_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BR_3Suite : public TestCommand
{
public:
    Test_TC_BR_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BR_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BR_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BR_4Suite : public TestCommand
{
public:
    Test_TC_BR_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BR_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BR_4Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DA_1_1Suite : public TestCommand
{
public:
    Test_TC_DA_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DA_1_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DA_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DA_1_2Suite : public TestCommand
{
public:
    Test_TC_DA_1_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DA_1_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DA_1_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DA_1_3Suite : public TestCommand
{
public:
    Test_TC_DA_1_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DA_1_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DA_1_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DA_1_4Suite : public TestCommand
{
public:
    Test_TC_DA_1_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DA_1_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DA_1_4Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DA_1_5Suite : public TestCommand
{
public:
    Test_TC_DA_1_5Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DA_1_5", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DA_1_5Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DA_1_6Suite : public TestCommand
{
public:
    Test_TC_DA_1_6Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DA_1_6", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DA_1_6Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DA_1_7Suite : public TestCommand
{
public:
    Test_TC_DA_1_7Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DA_1_7", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DA_1_7Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BINFO_2_2Suite : public TestCommand
{
public:
    Test_TC_BINFO_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BINFO_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BINFO_2_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BINFO_2_4Suite : public TestCommand
{
public:
    Test_TC_BINFO_2_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BINFO_2_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BINFO_2_4Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_OPCREDS_3_1Suite : public TestCommand
{
public:
    Test_TC_OPCREDS_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_OPCREDS_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_OPCREDS_3_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_OPCREDS_3_2Suite : public TestCommand
{
public:
    Test_TC_OPCREDS_3_2Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_OPCREDS_3_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_OPCREDS_3_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_OPCREDS_3_3Suite : public TestCommand
{
public:
    Test_TC_OPCREDS_3_3Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_OPCREDS_3_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_OPCREDS_3_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_OPCREDS_3_4Suite : public TestCommand
{
public:
    Test_TC_OPCREDS_3_4Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_OPCREDS_3_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_OPCREDS_3_4Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CNET_4_1Suite : public TestCommand
{
public:
    Test_TC_CNET_4_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CNET_4_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CNET_4_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CNET_4_2Suite : public TestCommand
{
public:
    Test_TC_CNET_4_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CNET_4_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CNET_4_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CNET_4_3Suite : public TestCommand
{
public:
    Test_TC_CNET_4_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CNET_4_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CNET_4_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CNET_4_4Suite : public TestCommand
{
public:
    Test_TC_CNET_4_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CNET_4_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CNET_4_4Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CNET_4_5Suite : public TestCommand
{
public:
    Test_TC_CNET_4_5Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CNET_4_5", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CNET_4_5Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CNET_4_6Suite : public TestCommand
{
public:
    Test_TC_CNET_4_6Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CNET_4_6", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CNET_4_6Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CNET_4_9Suite : public TestCommand
{
public:
    Test_TC_CNET_4_9Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CNET_4_9", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CNET_4_9Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CNET_4_10Suite : public TestCommand
{
public:
    Test_TC_CNET_4_10Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CNET_4_10", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CNET_4_10Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CNET_4_11Suite : public TestCommand
{
public:
    Test_TC_CNET_4_11Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CNET_4_11", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CNET_4_11Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CNET_4_12Suite : public TestCommand
{
public:
    Test_TC_CNET_4_12Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CNET_4_12", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CNET_4_12Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CNET_4_13Suite : public TestCommand
{
public:
    Test_TC_CNET_4_13Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CNET_4_13", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CNET_4_13Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CNET_4_14Suite : public TestCommand
{
public:
    Test_TC_CNET_4_14Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CNET_4_14", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CNET_4_14Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CNET_4_15Suite : public TestCommand
{
public:
    Test_TC_CNET_4_15Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CNET_4_15", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CNET_4_15Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CNET_4_16Suite : public TestCommand
{
public:
    Test_TC_CNET_4_16Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CNET_4_16", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CNET_4_16Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CNET_4_17Suite : public TestCommand
{
public:
    Test_TC_CNET_4_17Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CNET_4_17", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CNET_4_17Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CNET_4_18Suite : public TestCommand
{
public:
    Test_TC_CNET_4_18Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CNET_4_18", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CNET_4_18Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CNET_4_19Suite : public TestCommand
{
public:
    Test_TC_CNET_4_19Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CNET_4_19", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CNET_4_19Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CNET_4_20Suite : public TestCommand
{
public:
    Test_TC_CNET_4_20Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CNET_4_20", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CNET_4_20Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CNET_4_21Suite : public TestCommand
{
public:
    Test_TC_CNET_4_21Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CNET_4_21", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CNET_4_21Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CNET_4_22Suite : public TestCommand
{
public:
    Test_TC_CNET_4_22Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CNET_4_22", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CNET_4_22Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DLOG_2_1Suite : public TestCommand
{
public:
    Test_TC_DLOG_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DLOG_2_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DLOG_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DLOG_2_2Suite : public TestCommand
{
public:
    Test_TC_DLOG_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DLOG_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DLOG_2_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DLOG_3_1Suite : public TestCommand
{
public:
    Test_TC_DLOG_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DLOG_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DLOG_3_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DESC_2_1Suite : public TestCommand
{
public:
    Test_TC_DESC_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DESC_2_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DESC_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DESC_2_2Suite : public TestCommand
{
public:
    Test_TC_DESC_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DESC_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DESC_2_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGETH_3_1Suite : public TestCommand
{
public:
    Test_TC_DGETH_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGETH_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGETH_3_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGETH_3_2Suite : public TestCommand
{
public:
    Test_TC_DGETH_3_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGETH_3_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGETH_3_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CGEN_2_2Suite : public TestCommand
{
public:
    Test_TC_CGEN_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CGEN_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CGEN_2_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CGEN_2_4Suite : public TestCommand
{
public:
    Test_TC_CGEN_2_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CGEN_2_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CGEN_2_4Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGGEN_2_2Suite : public TestCommand
{
public:
    Test_TC_DGGEN_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGGEN_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGGEN_2_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGGEN_2_3Suite : public TestCommand
{
public:
    Test_TC_DGGEN_2_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGGEN_2_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGGEN_2_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGGEN_3_1Suite : public TestCommand
{
public:
    Test_TC_DGGEN_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGGEN_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGGEN_3_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_I_3_1Suite : public TestCommand
{
public:
    Test_TC_I_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_I_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_I_3_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_I_3_2Suite : public TestCommand
{
public:
    Test_TC_I_3_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_I_3_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_I_3_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ILL_3_1Suite : public TestCommand
{
public:
    Test_TC_ILL_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ILL_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ILL_3_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_IDM_1_1Suite : public TestCommand
{
public:
    Test_TC_IDM_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_IDM_1_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_IDM_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_IDM_1_2Suite : public TestCommand
{
public:
    Test_TC_IDM_1_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_IDM_1_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_IDM_1_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_IDM_2_1Suite : public TestCommand
{
public:
    Test_TC_IDM_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_IDM_2_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_IDM_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_IDM_2_2Suite : public TestCommand
{
public:
    Test_TC_IDM_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_IDM_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_IDM_2_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_IDM_3_1Suite : public TestCommand
{
public:
    Test_TC_IDM_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_IDM_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_IDM_3_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_IDM_3_2Suite : public TestCommand
{
public:
    Test_TC_IDM_3_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_IDM_3_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_IDM_3_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_IDM_4_1Suite : public TestCommand
{
public:
    Test_TC_IDM_4_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_IDM_4_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_IDM_4_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_IDM_4_2Suite : public TestCommand
{
public:
    Test_TC_IDM_4_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_IDM_4_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_IDM_4_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_IDM_4_3Suite : public TestCommand
{
public:
    Test_TC_IDM_4_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_IDM_4_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_IDM_4_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_IDM_5_1Suite : public TestCommand
{
public:
    Test_TC_IDM_5_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_IDM_5_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_IDM_5_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_IDM_5_2Suite : public TestCommand
{
public:
    Test_TC_IDM_5_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_IDM_5_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_IDM_5_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_IDM_6_1Suite : public TestCommand
{
public:
    Test_TC_IDM_6_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_IDM_6_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_IDM_6_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_IDM_6_2Suite : public TestCommand
{
public:
    Test_TC_IDM_6_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_IDM_6_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_IDM_6_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_IDM_6_3Suite : public TestCommand
{
public:
    Test_TC_IDM_6_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_IDM_6_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_IDM_6_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_IDM_6_4Suite : public TestCommand
{
public:
    Test_TC_IDM_6_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_IDM_6_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_IDM_6_4Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_IDM_7_1Suite : public TestCommand
{
public:
    Test_TC_IDM_7_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_IDM_7_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_IDM_7_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_IDM_8_1Suite : public TestCommand
{
public:
    Test_TC_IDM_8_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_IDM_8_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_IDM_8_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_LOWPOWER_2_2Suite : public TestCommand
{
public:
    Test_TC_LOWPOWER_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_LOWPOWER_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_LOWPOWER_2_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_APPLAUNCHER_3_7_1Suite : public TestCommand
{
public:
    Test_TC_APPLAUNCHER_3_7_1Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_APPLAUNCHER_3_7_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_APPLAUNCHER_3_7_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_APPLAUNCHER_3_8_1Suite : public TestCommand
{
public:
    Test_TC_APPLAUNCHER_3_8_1Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_APPLAUNCHER_3_8_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_APPLAUNCHER_3_8_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_APPLAUNCHER_3_9_1Suite : public TestCommand
{
public:
    Test_TC_APPLAUNCHER_3_9_1Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_APPLAUNCHER_3_9_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_APPLAUNCHER_3_9_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAINPUT_3_14Suite : public TestCommand
{
public:
    Test_TC_MEDIAINPUT_3_14Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_MEDIAINPUT_3_14", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MEDIAINPUT_3_14Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAINPUT_3_15Suite : public TestCommand
{
public:
    Test_TC_MEDIAINPUT_3_15Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_MEDIAINPUT_3_15", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MEDIAINPUT_3_15Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAINPUT_3_16Suite : public TestCommand
{
public:
    Test_TC_MEDIAINPUT_3_16Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_MEDIAINPUT_3_16", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MEDIAINPUT_3_16Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAINPUT_3_17Suite : public TestCommand
{
public:
    Test_TC_MEDIAINPUT_3_17Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_MEDIAINPUT_3_17", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MEDIAINPUT_3_17Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_WAKEONLAN_4_1Suite : public TestCommand
{
public:
    Test_TC_WAKEONLAN_4_1Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_WAKEONLAN_4_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_WAKEONLAN_4_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CHANNEL_5_4Suite : public TestCommand
{
public:
    Test_TC_CHANNEL_5_4Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CHANNEL_5_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CHANNEL_5_4Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CHANNEL_5_5Suite : public TestCommand
{
public:
    Test_TC_CHANNEL_5_5Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CHANNEL_5_5", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CHANNEL_5_5Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CHANNEL_5_6Suite : public TestCommand
{
public:
    Test_TC_CHANNEL_5_6Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CHANNEL_5_6", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CHANNEL_5_6Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_KEYPADINPUT_3_1Suite : public TestCommand
{
public:
    Test_TC_KEYPADINPUT_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_KEYPADINPUT_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_KEYPADINPUT_3_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAPLAYBACK_6_5Suite : public TestCommand
{
public:
    Test_TC_MEDIAPLAYBACK_6_5Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_MEDIAPLAYBACK_6_5", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MEDIAPLAYBACK_6_5Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAPLAYBACK_6_7Suite : public TestCommand
{
public:
    Test_TC_MEDIAPLAYBACK_6_7Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_MEDIAPLAYBACK_6_7", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MEDIAPLAYBACK_6_7Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_AUDIOOUTPUT_7_3Suite : public TestCommand
{
public:
    Test_TC_AUDIOOUTPUT_7_3Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_AUDIOOUTPUT_7_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_AUDIOOUTPUT_7_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_AUDIOOUTPUT_7_4Suite : public TestCommand
{
public:
    Test_TC_AUDIOOUTPUT_7_4Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_AUDIOOUTPUT_7_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_AUDIOOUTPUT_7_4Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CONTENTLAUNCHER_10_3Suite : public TestCommand
{
public:
    Test_TC_CONTENTLAUNCHER_10_3Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CONTENTLAUNCHER_10_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CONTENTLAUNCHER_10_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CONTENTLAUNCHER_10_4Suite : public TestCommand
{
public:
    Test_TC_CONTENTLAUNCHER_10_4Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CONTENTLAUNCHER_10_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CONTENTLAUNCHER_10_4Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CONTENTLAUNCHER_10_5Suite : public TestCommand
{
public:
    Test_TC_CONTENTLAUNCHER_10_5Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CONTENTLAUNCHER_10_5", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CONTENTLAUNCHER_10_5Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CONTENTLAUNCHER_10_7Suite : public TestCommand
{
public:
    Test_TC_CONTENTLAUNCHER_10_7Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CONTENTLAUNCHER_10_7", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CONTENTLAUNCHER_10_7Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MC_11_1Suite : public TestCommand
{
public:
    Test_TC_MC_11_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_MC_11_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MC_11_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MC_11_2Suite : public TestCommand
{
public:
    Test_TC_MC_11_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_MC_11_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MC_11_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ALOGIN_12_1Suite : public TestCommand
{
public:
    Test_TC_ALOGIN_12_1Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_ALOGIN_12_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ALOGIN_12_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ALOGIN_12_2Suite : public TestCommand
{
public:
    Test_TC_ALOGIN_12_2Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_ALOGIN_12_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ALOGIN_12_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_1Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CADMIN_1_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CADMIN_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_2Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CADMIN_1_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CADMIN_1_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_7Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_7Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CADMIN_1_7", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CADMIN_1_7Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_8Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_8Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CADMIN_1_8", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CADMIN_1_8Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_11Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_11Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CADMIN_1_11", 21, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
        AddArgument("nodeId2", 0, UINT64_MAX, &mNodeId2);
        AddArgument("nodeId3", 0, UINT64_MAX, &mNodeId3);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("discriminator", 0, UINT16_MAX, &mDiscriminator);
        AddArgument("payload", &mPayload);
        AddArgument("PakeVerifier", &mPakeVerifier);
    }

    ~Test_TC_CADMIN_1_11Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(mTimeout.ValueOr(400)); }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<uint16_t> mTimeout;
    chip::Optional<chip::NodeId> mNodeId2;
    chip::Optional<chip::NodeId> mNodeId3;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mDiscriminator;
    chip::Optional<chip::CharSpan> mPayload;
    chip::Optional<chip::ByteSpan> mPakeVerifier;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            VerifyOrReturn(CheckValue("clusterStatus", status.mClusterStatus.HasValue(), true));
            VerifyOrReturn(CheckValue("clusterStatus", status.mClusterStatus.Value(), 2));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::OperationalCredentials::Structs::FabricDescriptor::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 0));
                    VerifyOrReturn(CheckValueAsString("fabrics[0].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 1));
                    VerifyOrReturn(CheckValueAsString("fabrics[1].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 2));
                    VerifyOrReturn(CheckValueAsString("fabrics[2].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("fabrics", iter_0, 3));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            VerifyOrReturn(CheckValue("clusterStatus", status.mClusterStatus.HasValue(), true));
            VerifyOrReturn(CheckValue("clusterStatus", status.mClusterStatus.Value(), 2));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::OperationalCredentials::Structs::FabricDescriptor::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 0));
                    VerifyOrReturn(CheckValueAsString("fabrics[0].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 1));
                    VerifyOrReturn(CheckValueAsString("fabrics[1].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 2));
                    VerifyOrReturn(CheckValueAsString("fabrics[2].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("fabrics", iter_0, 3));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            VerifyOrReturn(CheckValue("clusterStatus", status.mClusterStatus.HasValue(), true));
            VerifyOrReturn(CheckValue("clusterStatus", status.mClusterStatus.Value(), 2));
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Precondition: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::FactoryReset::Type value;
            return FactoryReset(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Precondition: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Factory Reset the DUT and enter 'y' after successgarbage: not in length on purpose", 49);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 2: {
            LogStep(2, "TH_CR1 starts a commissioning process with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "TH_CR1 opens a commissioning window on DUT_CE using ECM");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            value.PAKEVerifier         = mPakeVerifier.HasValue()
                ? mPakeVerifier.Value()
                : chip::ByteSpan(
                      chip::Uint8::from_const_char(
                          "\xb9\x61\x70\xaa\xe8\x03\x34\x68\x84\x72\x4f\xe9\xa3\xb2\x87\xc3\x03\x30\xc2\xa6\x60\x37\x5d\x17\xbb\x20"
                          "\x5a\x8c\xf1\xae\xcb\x35\x04\x57\xf8\xab\x79\xee\x25\x3a\xb6\xa8\xe4\x6b\xb0\x9e\x54\x3a\xe4\x22\x73\x6d"
                          "\xe5\x01\xe3\xdb\x37\xd4\x41\xfe\x34\x49\x20\xd0\x95\x48\xe4\xc1\x82\x40\x63\x0c\x4f\xf4\x91\x3c\x53\x51"
                          "\x38\x39\xb7\xc0\x7f\xcc\x06\x27\xa1\xb8\x57\x3a\x14\x9f\xcd\x1f\xa4\x66\xcf"),
                      97);
            value.discriminator = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840U;
            value.iterations    = 1000UL;
            value.salt = chip::ByteSpan(chip::Uint8::from_const_char("SPAKE2P Key Saltgarbage: not in length on purpose"), 16);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Verify that the DNS-SD advertisement shows CM=2");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "TH_CR3 starts a commissioning process with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId3.HasValue() ? mNodeId3.Value() : 12586990ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityGamma, value);
        }
        case 6: {
            LogStep(6, "DUT_CE is commissioned to TH_CR3 on Fabric ID3 with Node ID3");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId3.HasValue() ? mNodeId3.Value() : 12586990ULL;
            return WaitForCommissionee(kIdentityGamma, value);
        }
        case 7: {
            LogStep(7, "TH_CR1 opens a commissioning window on DUT_CE using ECM");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            value.PAKEVerifier         = mPakeVerifier.HasValue()
                ? mPakeVerifier.Value()
                : chip::ByteSpan(
                      chip::Uint8::from_const_char(
                          "\xb9\x61\x70\xaa\xe8\x03\x34\x68\x84\x72\x4f\xe9\xa3\xb2\x87\xc3\x03\x30\xc2\xa6\x60\x37\x5d\x17\xbb\x20"
                          "\x5a\x8c\xf1\xae\xcb\x35\x04\x57\xf8\xab\x79\xee\x25\x3a\xb6\xa8\xe4\x6b\xb0\x9e\x54\x3a\xe4\x22\x73\x6d"
                          "\xe5\x01\xe3\xdb\x37\xd4\x41\xfe\x34\x49\x20\xd0\x95\x48\xe4\xc1\x82\x40\x63\x0c\x4f\xf4\x91\x3c\x53\x51"
                          "\x38\x39\xb7\xc0\x7f\xcc\x06\x27\xa1\xb8\x57\x3a\x14\x9f\xcd\x1f\xa4\x66\xcf"),
                      97);
            value.discriminator = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840U;
            value.iterations    = 1000UL;
            value.salt = chip::ByteSpan(chip::Uint8::from_const_char("SPAKE2P Key Saltgarbage: not in length on purpose"), 16);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "TH_CR2 starts a commissioning process with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 9: {
            LogStep(9, "DUT_CE is commissioned to TH_CR2");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            return WaitForCommissionee(kIdentityBeta, value);
        }
        case 10: {
            LogStep(10, "TH_CR1 opens a commissioning window on DUT_CE using ECM");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            value.PAKEVerifier         = mPakeVerifier.HasValue()
                ? mPakeVerifier.Value()
                : chip::ByteSpan(
                      chip::Uint8::from_const_char(
                          "\xb9\x61\x70\xaa\xe8\x03\x34\x68\x84\x72\x4f\xe9\xa3\xb2\x87\xc3\x03\x30\xc2\xa6\x60\x37\x5d\x17\xbb\x20"
                          "\x5a\x8c\xf1\xae\xcb\x35\x04\x57\xf8\xab\x79\xee\x25\x3a\xb6\xa8\xe4\x6b\xb0\x9e\x54\x3a\xe4\x22\x73\x6d"
                          "\xe5\x01\xe3\xdb\x37\xd4\x41\xfe\x34\x49\x20\xd0\x95\x48\xe4\xc1\x82\x40\x63\x0c\x4f\xf4\x91\x3c\x53\x51"
                          "\x38\x39\xb7\xc0\x7f\xcc\x06\x27\xa1\xb8\x57\x3a\x14\x9f\xcd\x1f\xa4\x66\xcf"),
                      97);
            value.discriminator = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840U;
            value.iterations    = 1000UL;
            value.salt = chip::ByteSpan(chip::Uint8::from_const_char("SPAKE2P Key Saltgarbage: not in length on purpose"), 16);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 11: {
            LogStep(11,
                    "Before the expiration of PIXIT.CADMIN.CwDuration seconds which was set in step 5, TH_CR1 opens a 2nd "
                    "commissioning window on DUT_CE using a commissioning timeout of PIXIT.CADMIN.CwDuration seconds using ECM");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            value.PAKEVerifier         = mPakeVerifier.HasValue()
                ? mPakeVerifier.Value()
                : chip::ByteSpan(
                      chip::Uint8::from_const_char(
                          "\xb9\x61\x70\xaa\xe8\x03\x34\x68\x84\x72\x4f\xe9\xa3\xb2\x87\xc3\x03\x30\xc2\xa6\x60\x37\x5d\x17\xbb\x20"
                          "\x5a\x8c\xf1\xae\xcb\x35\x04\x57\xf8\xab\x79\xee\x25\x3a\xb6\xa8\xe4\x6b\xb0\x9e\x54\x3a\xe4\x22\x73\x6d"
                          "\xe5\x01\xe3\xdb\x37\xd4\x41\xfe\x34\x49\x20\xd0\x95\x48\xe4\xc1\x82\x40\x63\x0c\x4f\xf4\x91\x3c\x53\x51"
                          "\x38\x39\xb7\xc0\x7f\xcc\x06\x27\xa1\xb8\x57\x3a\x14\x9f\xcd\x1f\xa4\x66\xcf"),
                      97);
            value.discriminator = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840U;
            value.iterations    = 1000UL;
            value.salt = chip::ByteSpan(chip::Uint8::from_const_char("SPAKE2P Key Saltgarbage: not in length on purpose"), 16);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "TH_CR1 reads the list of Fabrics on DUT_CE");
            VerifyOrDo(!ShouldSkip("OPCREDS.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::Fabrics::Id, false, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Wait for the expiration of PIXIT.CADMIN.CwDuration seconds that was set in step 6");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 180000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14,
                    "TH_CR1 re-opens a commissioning window on DUT_CE using a commissioning timeout of PIXIT.CADMIN.CwDuration "
                    "seconds using BCM");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 15: {
            LogStep(15, "Verify that the DNS-SD advertisement shows CM=1");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 16: {
            LogStep(16,
                    "Before the expiration of PIXIT.CADMIN.CwDuration seconds that was set in step 10, TH_CR3 opens a 2nd "
                    "commissioning window on DUT_CE using a commissioning timeout of PIXIT.CADMIN.CwDuration seconds using BCM");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityGamma, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 17: {
            LogStep(17, "Wait for the expiration of PIXIT.CADMIN.CwDuration seconds that was set in step 11");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 180000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 18: {
            LogStep(18, "TH_CR1 reads the list of Fabrics on DUT_CE");
            VerifyOrDo(!ShouldSkip("OPCREDS.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::Fabrics::Id, false, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "TH_CR1 opens a commissioning window on DUT_CE using BCM");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 20: {
            LogStep(20,
                    "Before the expiration of PIXIT.CADMIN.CwDuration seconds that was set in step 14, TH_CR2 opens a second "
                    "commissioning window on DUT_CE using a commissioning timeout of PIXIT.CADMIN.CwDuration seconds using BCM");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityBeta, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_12Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_12Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CADMIN_1_12", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CADMIN_1_12Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_14Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_14Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CADMIN_1_14", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CADMIN_1_14Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_15Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_15Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CADMIN_1_15", 19, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("nodeId2", 0, UINT64_MAX, &mNodeId2);
        AddArgument("nodeId3", 0, UINT64_MAX, &mNodeId3);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("discriminator", 0, UINT16_MAX, &mDiscriminator);
        AddArgument("payload", &mPayload);
        AddArgument("PakeVerifier", &mPakeVerifier);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CADMIN_1_15Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::NodeId> mNodeId2;
    chip::Optional<chip::NodeId> mNodeId3;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mDiscriminator;
    chip::Optional<chip::CharSpan> mPayload;
    chip::Optional<chip::ByteSpan> mPakeVerifier;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::OperationalCredentials::Structs::FabricDescriptor::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 0));
                    VerifyOrReturn(CheckValueAsString("fabrics[0].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckValue("fabrics[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 1));
                    VerifyOrReturn(CheckValueAsString("fabrics[1].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckValue("fabrics[1].fabricIndex", iter_0.GetValue().fabricIndex, 2U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 2));
                    VerifyOrReturn(CheckValueAsString("fabrics[2].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckValue("fabrics[2].fabricIndex", iter_0.GetValue().fabricIndex, 3U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("fabrics", iter_0, 3));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::OperationalCredentials::Commands::NOCResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::OperationalCredentials::Structs::FabricDescriptor::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 0));
                    VerifyOrReturn(CheckValueAsString("fabrics[0].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckValue("fabrics[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 1));
                    VerifyOrReturn(CheckValueAsString("fabrics[1].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckValue("fabrics[1].fabricIndex", iter_0.GetValue().fabricIndex, 3U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("fabrics", iter_0, 2));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::OperationalCredentials::Structs::FabricDescriptor::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 0));
                    VerifyOrReturn(CheckValueAsString("fabrics[0].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckValue("fabrics[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 1));
                    VerifyOrReturn(CheckValueAsString("fabrics[1].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckValue("fabrics[1].fabricIndex", iter_0.GetValue().fabricIndex, 4U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 2));
                    VerifyOrReturn(CheckValueAsString("fabrics[2].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckValue("fabrics[2].fabricIndex", iter_0.GetValue().fabricIndex, 3U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("fabrics", iter_0, 3));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Precondition: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::FactoryReset::Type value;
            return FactoryReset(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Precondition: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Factory Reset the DUT and enter 'y' after successgarbage: not in length on purpose", 49);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 2: {
            LogStep(2, "TH_CR1 starts a commissioning process with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "TH_CR1 opens a commissioning window on DUT_CE using ECM");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            value.PAKEVerifier         = mPakeVerifier.HasValue()
                ? mPakeVerifier.Value()
                : chip::ByteSpan(
                      chip::Uint8::from_const_char(
                          "\xb9\x61\x70\xaa\xe8\x03\x34\x68\x84\x72\x4f\xe9\xa3\xb2\x87\xc3\x03\x30\xc2\xa6\x60\x37\x5d\x17\xbb\x20"
                          "\x5a\x8c\xf1\xae\xcb\x35\x04\x57\xf8\xab\x79\xee\x25\x3a\xb6\xa8\xe4\x6b\xb0\x9e\x54\x3a\xe4\x22\x73\x6d"
                          "\xe5\x01\xe3\xdb\x37\xd4\x41\xfe\x34\x49\x20\xd0\x95\x48\xe4\xc1\x82\x40\x63\x0c\x4f\xf4\x91\x3c\x53\x51"
                          "\x38\x39\xb7\xc0\x7f\xcc\x06\x27\xa1\xb8\x57\x3a\x14\x9f\xcd\x1f\xa4\x66\xcf"),
                      97);
            value.discriminator = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840U;
            value.iterations    = 1000UL;
            value.salt = chip::ByteSpan(chip::Uint8::from_const_char("SPAKE2P Key Saltgarbage: not in length on purpose"), 16);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "TH_CR2 starts a commissioning process with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 5: {
            LogStep(5, "DUT_CE is commissioned to TH_CR2");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            return WaitForCommissionee(kIdentityBeta, value);
        }
        case 6: {
            LogStep(6, "TH_CR1 opens a commissioning window on DUT_CE using ECM");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            value.PAKEVerifier         = mPakeVerifier.HasValue()
                ? mPakeVerifier.Value()
                : chip::ByteSpan(
                      chip::Uint8::from_const_char(
                          "\xb9\x61\x70\xaa\xe8\x03\x34\x68\x84\x72\x4f\xe9\xa3\xb2\x87\xc3\x03\x30\xc2\xa6\x60\x37\x5d\x17\xbb\x20"
                          "\x5a\x8c\xf1\xae\xcb\x35\x04\x57\xf8\xab\x79\xee\x25\x3a\xb6\xa8\xe4\x6b\xb0\x9e\x54\x3a\xe4\x22\x73\x6d"
                          "\xe5\x01\xe3\xdb\x37\xd4\x41\xfe\x34\x49\x20\xd0\x95\x48\xe4\xc1\x82\x40\x63\x0c\x4f\xf4\x91\x3c\x53\x51"
                          "\x38\x39\xb7\xc0\x7f\xcc\x06\x27\xa1\xb8\x57\x3a\x14\x9f\xcd\x1f\xa4\x66\xcf"),
                      97);
            value.discriminator = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840U;
            value.iterations    = 1000UL;
            value.salt = chip::ByteSpan(chip::Uint8::from_const_char("SPAKE2P Key Saltgarbage: not in length on purpose"), 16);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "TH_CR3 Commissions with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId3.HasValue() ? mNodeId3.Value() : 12586990ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityGamma, value);
        }
        case 8: {
            LogStep(8, "DUT_CE is commissioned to TH_CR3");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId3.HasValue() ? mNodeId3.Value() : 12586990ULL;
            return WaitForCommissionee(kIdentityGamma, value);
        }
        case 9: {
            LogStep(9, "TH_CR2 reads the list of Fabrics on DUT_CE");
            VerifyOrDo(!ShouldSkip("OPCREDS.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityBeta, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::Fabrics::Id, false, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "TH_CR2 sends RemoveFabric with FabricIndex = 2 command to DUT_CE");
            VerifyOrDo(!ShouldSkip("OPCREDS.S.C0a.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OperationalCredentials::Commands::RemoveFabric::Type value;
            value.fabricIndex = 2U;
            return SendCommand(kIdentityBeta, GetEndpoint(0), OperationalCredentials::Id,
                               OperationalCredentials::Commands::RemoveFabric::Id, value, chip::Optional<uint16_t>(10000),
                               chip::NullOptional

            );
        }
        case 11: {
            LogStep(11, "TH_CR2 writes the Basic Information Clusters NodeLabel mandatory attribute of DUT_CE");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("chiptestgarbage: not in length on purpose", 8);
            return WriteAttribute(kIdentityBeta, GetEndpoint(0), Basic::Id, Basic::Attributes::NodeLabel::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "TH_CR2 reads the Basic Information Clusters NodeLabel mandatory attribute of DUT_CE");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0005 && PICS_USER_PROMPT"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "TH_CR1 reads the list of Fabrics on DUT_CE");
            VerifyOrDo(!ShouldSkip("OPCREDS.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::Fabrics::Id, false, chip::NullOptional);
        }
        case 14: {
            LogStep(14,
                    "Verify DUT_CE is now discoverable over DNS-SD with 2 Operational service records (_matter._tcp SRV records).");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 15: {
            LogStep(15, "TH_CR1 opens a commissioning window on DUT_CE using ECM");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            value.PAKEVerifier         = mPakeVerifier.HasValue()
                ? mPakeVerifier.Value()
                : chip::ByteSpan(
                      chip::Uint8::from_const_char(
                          "\xb9\x61\x70\xaa\xe8\x03\x34\x68\x84\x72\x4f\xe9\xa3\xb2\x87\xc3\x03\x30\xc2\xa6\x60\x37\x5d\x17\xbb\x20"
                          "\x5a\x8c\xf1\xae\xcb\x35\x04\x57\xf8\xab\x79\xee\x25\x3a\xb6\xa8\xe4\x6b\xb0\x9e\x54\x3a\xe4\x22\x73\x6d"
                          "\xe5\x01\xe3\xdb\x37\xd4\x41\xfe\x34\x49\x20\xd0\x95\x48\xe4\xc1\x82\x40\x63\x0c\x4f\xf4\x91\x3c\x53\x51"
                          "\x38\x39\xb7\xc0\x7f\xcc\x06\x27\xa1\xb8\x57\x3a\x14\x9f\xcd\x1f\xa4\x66\xcf"),
                      97);
            value.discriminator = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840U;
            value.iterations    = 1000UL;
            value.salt = chip::ByteSpan(chip::Uint8::from_const_char("SPAKE2P Key Saltgarbage: not in length on purpose"), 16);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 16: {
            LogStep(16, "TH_CR2 starts a commissioning process with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 17: {
            LogStep(17, "DUT_CE is commissioned to TH_CR2");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            return WaitForCommissionee(kIdentityBeta, value);
        }
        case 18: {
            LogStep(18, "TH_CR1 reads the list of Fabrics on DUT_CE");
            VerifyOrDo(!ShouldSkip("OPCREDS.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::Fabrics::Id, false, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_16Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_16Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CADMIN_1_16", 18, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("nodeId2", 0, UINT64_MAX, &mNodeId2);
        AddArgument("nodeId3", 0, UINT64_MAX, &mNodeId3);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("discriminator", 0, UINT16_MAX, &mDiscriminator);
        AddArgument("payload", &mPayload);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CADMIN_1_16Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::NodeId> mNodeId2;
    chip::Optional<chip::NodeId> mNodeId3;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mDiscriminator;
    chip::Optional<chip::CharSpan> mPayload;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::OperationalCredentials::Structs::FabricDescriptor::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 0));
                    VerifyOrReturn(CheckValueAsString("fabrics[0].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckValue("fabrics[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 1));
                    VerifyOrReturn(CheckValueAsString("fabrics[1].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckValue("fabrics[1].fabricIndex", iter_0.GetValue().fabricIndex, 2U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 2));
                    VerifyOrReturn(CheckValueAsString("fabrics[2].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckValue("fabrics[2].fabricIndex", iter_0.GetValue().fabricIndex, 3U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("fabrics", iter_0, 3));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::OperationalCredentials::Commands::NOCResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::OperationalCredentials::Structs::FabricDescriptor::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 0));
                    VerifyOrReturn(CheckValueAsString("fabrics[0].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckValue("fabrics[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 1));
                    VerifyOrReturn(CheckValueAsString("fabrics[1].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckValue("fabrics[1].fabricIndex", iter_0.GetValue().fabricIndex, 3U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("fabrics", iter_0, 2));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::OperationalCredentials::Structs::FabricDescriptor::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 0));
                    VerifyOrReturn(CheckValueAsString("fabrics[0].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckValue("fabrics[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 1));
                    VerifyOrReturn(CheckValueAsString("fabrics[1].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckValue("fabrics[1].fabricIndex", iter_0.GetValue().fabricIndex, 4U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 2));
                    VerifyOrReturn(CheckValueAsString("fabrics[2].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckValue("fabrics[2].fabricIndex", iter_0.GetValue().fabricIndex, 3U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("fabrics", iter_0, 3));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Precondition: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::FactoryReset::Type value;
            return FactoryReset(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Precondition: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Factory Reset the DUT and enter 'y' after successgarbage: not in length on purpose", 49);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 2: {
            LogStep(2, "TH_CR1 starts a commissioning process with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "TH_CR1 opens a commissioning window on DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "TH_CR2 starts a commissioning process with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 5: {
            LogStep(5, "DUT_CE is commissioned to TH_CR2");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            return WaitForCommissionee(kIdentityBeta, value);
        }
        case 6: {
            LogStep(6, "TH_CR1 opens a commissioning window on DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "TH_CR3 Commissions with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId3.HasValue() ? mNodeId3.Value() : 12586990ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityGamma, value);
        }
        case 8: {
            LogStep(8, "DUT_CE is commissioned to TH_CR3");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId3.HasValue() ? mNodeId3.Value() : 12586990ULL;
            return WaitForCommissionee(kIdentityGamma, value);
        }
        case 9: {
            LogStep(9, "TH_CR2 reads the list of Fabrics on DUT_CE");
            VerifyOrDo(!ShouldSkip("OPCREDS.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityBeta, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::Fabrics::Id, false, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "TH_CR2 sends RemoveFabric with FabricIndex = 2 command to DUT_CE");
            VerifyOrDo(!ShouldSkip("OPCREDS.S.C0a.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OperationalCredentials::Commands::RemoveFabric::Type value;
            value.fabricIndex = 2U;
            return SendCommand(kIdentityBeta, GetEndpoint(0), OperationalCredentials::Id,
                               OperationalCredentials::Commands::RemoveFabric::Id, value, chip::Optional<uint16_t>(10000),
                               chip::NullOptional

            );
        }
        case 11: {
            LogStep(11, "TH_CR2 writes the Basic Information Clusters NodeLabel mandatory attribute of DUT_CE");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("chiptestgarbage: not in length on purpose", 8);
            return WriteAttribute(kIdentityBeta, GetEndpoint(0), Basic::Id, Basic::Attributes::NodeLabel::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "TH_CR2 reads the Basic Information Clusters NodeLabel mandatory attribute of DUT_CE");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0005 && PICS_USER_PROMPT"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "TH_CR1 reads the list of Fabrics on DUT_CE");
            VerifyOrDo(!ShouldSkip("OPCREDS.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::Fabrics::Id, false, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "TH_CR1 opens a commissioning window on DUT_CE using BCM");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 15: {
            LogStep(15, "TH_CR2 starts a commissioning process with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 16: {
            LogStep(16, "DUT_CE is commissioned to TH_CR2");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            return WaitForCommissionee(kIdentityBeta, value);
        }
        case 17: {
            LogStep(17, "TH_CR1 reads the list of Fabrics on DUT_CE");
            VerifyOrDo(!ShouldSkip("OPCREDS.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::Fabrics::Id, false, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_17Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_17Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CADMIN_1_17", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CADMIN_1_17Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_18Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_18Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CADMIN_1_18", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CADMIN_1_18Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_19Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_19Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CADMIN_1_19", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CADMIN_1_19Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_20Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_20Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CADMIN_1_20", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CADMIN_1_20Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_21Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_21Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CADMIN_1_21", 8, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("discriminator", 0, UINT16_MAX, &mDiscriminator);
    }

    ~Test_TC_CADMIN_1_21Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(mTimeout.ValueOr(950)); }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<uint16_t> mTimeout;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mDiscriminator;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatus value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("windowStatus", value, 0U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatus value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("windowStatus", value, 0U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Precondition: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::FactoryReset::Type value;
            return FactoryReset(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Precondition: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Factory Reset the DUT and enter 'y' after successgarbage: not in length on purpose", 49);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 2: {
            LogStep(2, "TH_CR1 starts a commissioning process with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "TH_CR1 opens a commissioning window on DUT_CE using BCM");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 900U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Wait for commissioning Window to 901 seconds");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 901000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "TH_CR1 reads the window status to verify the DUT_CE window is closed");
            VerifyOrDo(!ShouldSkip("CADMIN.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::WindowStatus::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH_CR1 opens a commissioning window on DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 901U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "TH_CR1 reads the window status to verify the DUT_CE window is closed");
            VerifyOrDo(!ShouldSkip("CADMIN.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::WindowStatus::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_22Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_22Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CADMIN_1_22", 8, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("discriminator", 0, UINT16_MAX, &mDiscriminator);
        AddArgument("PakeVerifier", &mPakeVerifier);
    }

    ~Test_TC_CADMIN_1_22Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(mTimeout.ValueOr(950)); }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<uint16_t> mTimeout;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mDiscriminator;
    chip::Optional<chip::ByteSpan> mPakeVerifier;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatus value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("windowStatus", value, 0U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatus value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("windowStatus", value, 0U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Precondition: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::FactoryReset::Type value;
            return FactoryReset(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Precondition: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Factory Reset the DUT and enter 'y' after successgarbage: not in length on purpose", 49);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 2: {
            LogStep(2, "TH_CR1 starts a commissioning process with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "TH_CR1 opens a commissioning window on DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenCommissioningWindow::Type value;
            value.commissioningTimeout = 900U;
            value.PAKEVerifier         = mPakeVerifier.HasValue()
                ? mPakeVerifier.Value()
                : chip::ByteSpan(
                      chip::Uint8::from_const_char(
                          "\xb9\x61\x70\xaa\xe8\x03\x34\x68\x84\x72\x4f\xe9\xa3\xb2\x87\xc3\x03\x30\xc2\xa6\x60\x37\x5d\x17\xbb\x20"
                          "\x5a\x8c\xf1\xae\xcb\x35\x04\x57\xf8\xab\x79\xee\x25\x3a\xb6\xa8\xe4\x6b\xb0\x9e\x54\x3a\xe4\x22\x73\x6d"
                          "\xe5\x01\xe3\xdb\x37\xd4\x41\xfe\x34\x49\x20\xd0\x95\x48\xe4\xc1\x82\x40\x63\x0c\x4f\xf4\x91\x3c\x53\x51"
                          "\x38\x39\xb7\xc0\x7f\xcc\x06\x27\xa1\xb8\x57\x3a\x14\x9f\xcd\x1f\xa4\x66\xcf"),
                      97);
            value.discriminator = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840U;
            value.iterations    = 1000UL;
            value.salt = chip::ByteSpan(chip::Uint8::from_const_char("SPAKE2P Key Saltgarbage: not in length on purpose"), 16);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Wait for commissioning Window to 901 seconds");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 901000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "TH_CR1 reads the window status to verify the DUT_CE window is closed");
            VerifyOrDo(!ShouldSkip("CADMIN.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::WindowStatus::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH_CR1 opens a commissioning window on DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenCommissioningWindow::Type value;
            value.commissioningTimeout = 901U;
            value.PAKEVerifier         = mPakeVerifier.HasValue()
                ? mPakeVerifier.Value()
                : chip::ByteSpan(
                      chip::Uint8::from_const_char(
                          "\xb9\x61\x70\xaa\xe8\x03\x34\x68\x84\x72\x4f\xe9\xa3\xb2\x87\xc3\x03\x30\xc2\xa6\x60\x37\x5d\x17\xbb\x20"
                          "\x5a\x8c\xf1\xae\xcb\x35\x04\x57\xf8\xab\x79\xee\x25\x3a\xb6\xa8\xe4\x6b\xb0\x9e\x54\x3a\xe4\x22\x73\x6d"
                          "\xe5\x01\xe3\xdb\x37\xd4\x41\xfe\x34\x49\x20\xd0\x95\x48\xe4\xc1\x82\x40\x63\x0c\x4f\xf4\x91\x3c\x53\x51"
                          "\x38\x39\xb7\xc0\x7f\xcc\x06\x27\xa1\xb8\x57\x3a\x14\x9f\xcd\x1f\xa4\x66\xcf"),
                      97);
            value.discriminator = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840U;
            value.iterations    = 1000UL;
            value.salt = chip::ByteSpan(chip::Uint8::from_const_char("SPAKE2P Key Saltgarbage: not in length on purpose"), 16);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "TH_CR1 reads the window status to verify the DUT_CE window is closed");
            VerifyOrDo(!ShouldSkip("CADMIN.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::WindowStatus::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_3Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CADMIN_1_3", 21, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
        AddArgument("nodeId2", 0, UINT64_MAX, &mNodeId2);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("discriminator", 0, UINT16_MAX, &mDiscriminator);
        AddArgument("payload", &mPayload);
        AddArgument("PakeVerifier", &mPakeVerifier);
    }

    ~Test_TC_CADMIN_1_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(mTimeout.ValueOr(300)); }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<uint16_t> mTimeout;
    chip::Optional<chip::NodeId> mNodeId2;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mDiscriminator;
    chip::Optional<chip::CharSpan> mPayload;
    chip::Optional<chip::ByteSpan> mPakeVerifier;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("nodeLabel", value, chip::CharSpan("chiptest", 8)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 32));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::OperationalCredentials::Structs::FabricDescriptor::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 0));
                    VerifyOrReturn(CheckValueAsString("fabrics[0].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 1));
                    VerifyOrReturn(CheckValueAsString("fabrics[1].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("fabrics", iter_0, 2));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::OperationalCredentials::Structs::FabricDescriptor::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 0));
                    VerifyOrReturn(CheckValueAsString("fabrics[0].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 1));
                    VerifyOrReturn(CheckValueAsString("fabrics[1].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("fabrics", iter_0, 2));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("nodeLabel", value, chip::CharSpan("chiptest1", 9)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 32));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("nodeLabel", value, chip::CharSpan("chiptest2", 9)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 32));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatus value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("windowStatus", value, 0U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            VerifyOrReturn(CheckValue("clusterStatus", status.mClusterStatus.HasValue(), true));
            VerifyOrReturn(CheckValue("clusterStatus", status.mClusterStatus.Value(), 9));
            shouldContinue = true;
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Precondition: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::FactoryReset::Type value;
            return FactoryReset(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Precondition: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Factory Reset the DUT and enter 'y' after successgarbage: not in length on purpose", 49);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 2: {
            LogStep(2, "TH_CR1 starts a commissioning process with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "TH_CR1 opens a commissioning window on DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            value.PAKEVerifier         = mPakeVerifier.HasValue()
                ? mPakeVerifier.Value()
                : chip::ByteSpan(
                      chip::Uint8::from_const_char(
                          "\xb9\x61\x70\xaa\xe8\x03\x34\x68\x84\x72\x4f\xe9\xa3\xb2\x87\xc3\x03\x30\xc2\xa6\x60\x37\x5d\x17\xbb\x20"
                          "\x5a\x8c\xf1\xae\xcb\x35\x04\x57\xf8\xab\x79\xee\x25\x3a\xb6\xa8\xe4\x6b\xb0\x9e\x54\x3a\xe4\x22\x73\x6d"
                          "\xe5\x01\xe3\xdb\x37\xd4\x41\xfe\x34\x49\x20\xd0\x95\x48\xe4\xc1\x82\x40\x63\x0c\x4f\xf4\x91\x3c\x53\x51"
                          "\x38\x39\xb7\xc0\x7f\xcc\x06\x27\xa1\xb8\x57\x3a\x14\x9f\xcd\x1f\xa4\x66\xcf"),
                      97);
            value.discriminator = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840U;
            value.iterations    = 1000UL;
            value.salt = chip::ByteSpan(chip::Uint8::from_const_char("SPAKE2P Key Saltgarbage: not in length on purpose"), 16);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Verify that the DNS-SD advertisement shows CM=2");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "TH_CR1 writes the Basic Information Clusters NodeLabel mandatory attribute of DUT_CE");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("chiptestgarbage: not in length on purpose", 8);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::NodeLabel::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH_CR1 reads the Basic Information Clusters NodeLabel mandatory attribute of DUT_CE");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::NodeLabel::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH_CR2 starts a commissioning process with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 8: {
            LogStep(8, "DUT_CE is commissioned by TH_CR2 on Fabric ID2");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            return WaitForCommissionee(kIdentityBeta, value);
        }
        case 9: {
            LogStep(9, "Verify DUT_CE is now discoverable over DNS-SD with two SRV Records");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "TH_CR1 reads the list of Fabrics on DUT_CE");
            VerifyOrDo(!ShouldSkip("OPCREDS.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::Fabrics::Id, false, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "TH_CR2 reads the list of Fabrics on DUT_CE");
            VerifyOrDo(!ShouldSkip("OPCREDS.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityBeta, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::Fabrics::Id, false, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "TH_CR1 writes the Basic Information Clusters NodeLabel mandatory attribute of DUT_CE");
            VerifyOrDo(!ShouldSkip("OPCREDS.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("chiptest1garbage: not in length on purpose", 9);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::NodeLabel::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "TH_CR1 reads the Basic Information Clusters NodeLabel mandatory attribute of DUT_CE");
            VerifyOrDo(!ShouldSkip("OPCREDS.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::NodeLabel::Id, true,
                                 chip::NullOptional);
        }
        case 14: {
            LogStep(14, "TH_CR2 writes the Basic Information Clusters NodeLabel mandatory attribute of DUT_CE");
            VerifyOrDo(!ShouldSkip("OPCREDS.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("chiptest2garbage: not in length on purpose", 9);
            return WriteAttribute(kIdentityBeta, GetEndpoint(0), Basic::Id, Basic::Attributes::NodeLabel::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "TH_CR2 reads the Basic Information Clusters NodeLabel mandatory attribute of DUT_CE");
            VerifyOrDo(!ShouldSkip("OPCREDS.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityBeta, GetEndpoint(0), Basic::Id, Basic::Attributes::NodeLabel::Id, true,
                                 chip::NullOptional);
        }
        case 16: {
            LogStep(16, "TH_CR2 opens a commissioning window on DUT_CE using ECM");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            value.PAKEVerifier         = mPakeVerifier.HasValue()
                ? mPakeVerifier.Value()
                : chip::ByteSpan(
                      chip::Uint8::from_const_char(
                          "\xb9\x61\x70\xaa\xe8\x03\x34\x68\x84\x72\x4f\xe9\xa3\xb2\x87\xc3\x03\x30\xc2\xa6\x60\x37\x5d\x17\xbb\x20"
                          "\x5a\x8c\xf1\xae\xcb\x35\x04\x57\xf8\xab\x79\xee\x25\x3a\xb6\xa8\xe4\x6b\xb0\x9e\x54\x3a\xe4\x22\x73\x6d"
                          "\xe5\x01\xe3\xdb\x37\xd4\x41\xfe\x34\x49\x20\xd0\x95\x48\xe4\xc1\x82\x40\x63\x0c\x4f\xf4\x91\x3c\x53\x51"
                          "\x38\x39\xb7\xc0\x7f\xcc\x06\x27\xa1\xb8\x57\x3a\x14\x9f\xcd\x1f\xa4\x66\xcf"),
                      97);
            value.discriminator = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840U;
            value.iterations    = 1000UL;
            value.salt = chip::ByteSpan(chip::Uint8::from_const_char("SPAKE2P Key Saltgarbage: not in length on purpose"), 16);
            return SendCommand(kIdentityBeta, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 17: {
            LogStep(17, "Wait for the commissioning window in step 13 to timeout");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 180000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 18: {
            LogStep(18, "TH_CR2 reads the window status to verify the DUT_CE window is closed");
            VerifyOrDo(!ShouldSkip("CADMIN.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::WindowStatus::Id, true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "TH_CR2 opens a commissioning window on DUT_CE using ECM");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            value.PAKEVerifier         = mPakeVerifier.HasValue()
                ? mPakeVerifier.Value()
                : chip::ByteSpan(
                      chip::Uint8::from_const_char(
                          "\xb9\x61\x70\xaa\xe8\x03\x34\x68\x84\x72\x4f\xe9\xa3\xb2\x87\xc3\x03\x30\xc2\xa6\x60\x37\x5d\x17\xbb\x20"
                          "\x5a\x8c\xf1\xae\xcb\x35\x04\x57\xf8\xab\x79\xee\x25\x3a\xb6\xa8\xe4\x6b\xb0\x9e\x54\x3a\xe4\x22\x73\x6d"
                          "\xe5\x01\xe3\xdb\x37\xd4\x41\xfe\x34\x49\x20\xd0\x95\x48\xe4\xc1\x82\x40\x63\x0c\x4f\xf4\x91\x3c\x53\x51"
                          "\x38\x39\xb7\xc0\x7f\xcc\x06\x27\xa1\xb8\x57\x3a\x14\x9f\xcd\x1f\xa4\x66\xcf"),
                      97);
            value.discriminator = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840U;
            value.iterations    = 1000UL;
            value.salt = chip::ByteSpan(chip::Uint8::from_const_char("SPAKE2P Key Saltgarbage: not in length on purpose"), 16);
            return SendCommand(kIdentityBeta, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 20: {
            LogStep(20, "TH_CR1 starts a commissioning process with DUT_CE before the timeout from step 12");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityAlpha, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_4Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CADMIN_1_4", 21, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
        AddArgument("nodeId2", 0, UINT64_MAX, &mNodeId2);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("discriminator", 0, UINT16_MAX, &mDiscriminator);
        AddArgument("payload", &mPayload);
    }

    ~Test_TC_CADMIN_1_4Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(mTimeout.ValueOr(300)); }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<uint16_t> mTimeout;
    chip::Optional<chip::NodeId> mNodeId2;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mDiscriminator;
    chip::Optional<chip::CharSpan> mPayload;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 32));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::OperationalCredentials::Structs::FabricDescriptor::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 0));
                    VerifyOrReturn(CheckValueAsString("fabrics[0].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 1));
                    VerifyOrReturn(CheckValueAsString("fabrics[1].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("fabrics", iter_0, 2));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::OperationalCredentials::Structs::FabricDescriptor::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 0));
                    VerifyOrReturn(CheckValueAsString("fabrics[0].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 1));
                    VerifyOrReturn(CheckValueAsString("fabrics[1].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("fabrics", iter_0, 2));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("nodeLabel", value, chip::CharSpan("chiptest", 8)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 32));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("nodeLabel", value, chip::CharSpan("chiptest", 8)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 32));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatus value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("windowStatus", value, 0U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            VerifyOrReturn(CheckValue("clusterStatus", status.mClusterStatus.HasValue(), true));
            VerifyOrReturn(CheckValue("clusterStatus", status.mClusterStatus.Value(), 9));
            shouldContinue = true;
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Precondition: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::FactoryReset::Type value;
            return FactoryReset(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Precondition: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Factory Reset the DUT and enter 'y' after successgarbage: not in length on purpose", 49);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 2: {
            LogStep(2, "TH_CR1 starts a commissioning process with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "TH_CR1 opens a commissioning window on DUT_CE using BCM");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Verify that the DNS-SD advertisement shows CM=1");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "TH_CR1 writes the Basic Information Clusters NodeLabel mandatory attribute of DUT_CE");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("chiptestgarbage: not in length on purpose", 8);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::NodeLabel::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH_CR1 reads the Basic Information Clusters NodeLabel mandatory attribute of DUT_CE");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::NodeLabel::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH_CR2 starts a commissioning process with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 8: {
            LogStep(8, "DUT_CE is commissioned by TH_CR2 on Fabric ID2 ");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            return WaitForCommissionee(kIdentityBeta, value);
        }
        case 9: {
            LogStep(9, "Verify DUT_CE is now discoverable over DNS-SD with two SRV Records");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "TH_CR1 reads the list of Fabrics on DUT_CE");
            VerifyOrDo(!ShouldSkip("OPCREDS.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::Fabrics::Id, false, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "TH_CR2 reads the list of Fabrics on DUT_CE");
            VerifyOrDo(!ShouldSkip("OPCREDS.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityBeta, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::Fabrics::Id, false, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "TH_CR1 writes the Basic Information Clusters NodeLabel mandatory attribute of DUT_CE");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("chiptestgarbage: not in length on purpose", 8);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::NodeLabel::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "TH_CR1 reads the Basic Information Clusters NodeLabel mandatory attribute of DUT_CE");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::NodeLabel::Id, true,
                                 chip::NullOptional);
        }
        case 14: {
            LogStep(14, "TH_CR2 writes the Basic Information Clusters NodeLabel mandatory attribute of DUT_CE");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("chiptestgarbage: not in length on purpose", 8);
            return WriteAttribute(kIdentityBeta, GetEndpoint(0), Basic::Id, Basic::Attributes::NodeLabel::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "TH_CR2 reads the Basic Information Clusters NodeLabel mandatory attribute of DUT_CE");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityBeta, GetEndpoint(0), Basic::Id, Basic::Attributes::NodeLabel::Id, true,
                                 chip::NullOptional);
        }
        case 16: {
            LogStep(16, "TH_CR2 opens a commissioning window on DUT_CE using BCM");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityBeta, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 17: {
            LogStep(17, "Wait for the commissioning window in step 13 to timeout");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 180000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 18: {
            LogStep(18, "TH_CR2 reads the window status to verify the DUT_CE window is closed");
            VerifyOrDo(!ShouldSkip("CADMIN.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::WindowStatus::Id, true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "TH_CR2 opens a commissioning window on DUT_CE using BCM");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityBeta, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 20: {
            LogStep(20, "TH_CR1 starts a commissioning process with DUT_CE before the timeout from step 12");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityAlpha, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_5Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_5Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CADMIN_1_5", 20, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
        AddArgument("nodeIdForDuplicateCommissioning", 0, UINT64_MAX, &mNodeIdForDuplicateCommissioning);
        AddArgument("nodeId2", 0, UINT64_MAX, &mNodeId2);
        AddArgument("nodeId3", 0, UINT64_MAX, &mNodeId3);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("discriminator", 0, UINT16_MAX, &mDiscriminator);
        AddArgument("payload", &mPayload);
        AddArgument("PakeVerifier", &mPakeVerifier);
        AddArgument("IncorrectPakeVerifier", &mIncorrectPakeVerifier);
    }

    ~Test_TC_CADMIN_1_5Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(mTimeout.ValueOr(300)); }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<uint16_t> mTimeout;
    chip::Optional<chip::NodeId> mNodeIdForDuplicateCommissioning;
    chip::Optional<chip::NodeId> mNodeId2;
    chip::Optional<chip::NodeId> mNodeId3;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mDiscriminator;
    chip::Optional<chip::CharSpan> mPayload;
    chip::Optional<chip::ByteSpan> mPakeVerifier;
    chip::Optional<chip::ByteSpan> mIncorrectPakeVerifier;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("nodeLabel", value, chip::CharSpan("chiptest", 8)));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            VerifyOrReturn(CheckValue("clusterStatus", status.mClusterStatus.HasValue(), true));
            VerifyOrReturn(CheckValue("clusterStatus", status.mClusterStatus.Value(), 3));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            VerifyOrReturn(CheckValue("clusterStatus", status.mClusterStatus.HasValue(), true));
            VerifyOrReturn(CheckValue("clusterStatus", status.mClusterStatus.Value(), 2));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            VerifyOrReturn(CheckValue("clusterStatus", status.mClusterStatus.HasValue(), true));
            VerifyOrReturn(CheckValue("clusterStatus", status.mClusterStatus.Value(), 4));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Precondition: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::FactoryReset::Type value;
            return FactoryReset(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Precondition: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Factory Reset the DUT and enter 'y' after successgarbage: not in length on purpose", 49);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 2: {
            LogStep(2, "TH_CR1 starts a commissioning process with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "TH_CR1 opens a new commissioning window on DUT_CE using ECM");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            value.PAKEVerifier         = mPakeVerifier.HasValue()
                ? mPakeVerifier.Value()
                : chip::ByteSpan(
                      chip::Uint8::from_const_char(
                          "\xb9\x61\x70\xaa\xe8\x03\x34\x68\x84\x72\x4f\xe9\xa3\xb2\x87\xc3\x03\x30\xc2\xa6\x60\x37\x5d\x17\xbb\x20"
                          "\x5a\x8c\xf1\xae\xcb\x35\x04\x57\xf8\xab\x79\xee\x25\x3a\xb6\xa8\xe4\x6b\xb0\x9e\x54\x3a\xe4\x22\x73\x6d"
                          "\xe5\x01\xe3\xdb\x37\xd4\x41\xfe\x34\x49\x20\xd0\x95\x48\xe4\xc1\x82\x40\x63\x0c\x4f\xf4\x91\x3c\x53\x51"
                          "\x38\x39\xb7\xc0\x7f\xcc\x06\x27\xa1\xb8\x57\x3a\x14\x9f\xcd\x1f\xa4\x66\xcf"),
                      97);
            value.discriminator = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840U;
            value.iterations    = 1000UL;
            value.salt = chip::ByteSpan(chip::Uint8::from_const_char("SPAKE2P Key Saltgarbage: not in length on purpose"), 16);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Verify that the DNS-SD advertisement shows CM=2");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "Wait for PIXIT.CADMIN.CwDuration + 10 seconds");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 190000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6, "TH_CR2 starts a commissioning process with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 7: {
            LogStep(7, "TH_CR1 opens a new commissioning window on DUT_CE using ECM");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            value.PAKEVerifier         = mPakeVerifier.HasValue()
                ? mPakeVerifier.Value()
                : chip::ByteSpan(
                      chip::Uint8::from_const_char(
                          "\xb9\x61\x70\xaa\xe8\x03\x34\x68\x84\x72\x4f\xe9\xa3\xb2\x87\xc3\x03\x30\xc2\xa6\x60\x37\x5d\x17\xbb\x20"
                          "\x5a\x8c\xf1\xae\xcb\x35\x04\x57\xf8\xab\x79\xee\x25\x3a\xb6\xa8\xe4\x6b\xb0\x9e\x54\x3a\xe4\x22\x73\x6d"
                          "\xe5\x01\xe3\xdb\x37\xd4\x41\xfe\x34\x49\x20\xd0\x95\x48\xe4\xc1\x82\x40\x63\x0c\x4f\xf4\x91\x3c\x53\x51"
                          "\x38\x39\xb7\xc0\x7f\xcc\x06\x27\xa1\xb8\x57\x3a\x14\x9f\xcd\x1f\xa4\x66\xcf"),
                      97);
            value.discriminator = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840U;
            value.iterations    = 1000UL;
            value.salt = chip::ByteSpan(chip::Uint8::from_const_char("SPAKE2P Key Saltgarbage: not in length on purpose"), 16);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "TH_CR1 revokes the commissioning window on DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::RevokeCommissioning::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::RevokeCommissioning::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "TH_CR2 starts a commissioning process with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 10: {
            LogStep(10, "TH_CR1 revokes the commissioning window on DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::RevokeCommissioning::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::RevokeCommissioning::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 11: {
            LogStep(11, "TH_CR1 writes the mandatory attribute NodeLabel of DUT_CE");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("chiptestgarbage: not in length on purpose", 8);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::NodeLabel::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "TH_CR1 read the mandatory attribute NodeLabel of DUT_CE");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::NodeLabel::Id, true,
                                 chip::NullOptional);
        }
        case 13: {
            LogStep(13, "TH_CR1 opens a new commissioning window on DUT_CE using wrong PakeVerifier value using ECM");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            value.PAKEVerifier         = mIncorrectPakeVerifier.HasValue()
                ? mIncorrectPakeVerifier.Value()
                : chip::ByteSpan(chip::Uint8::from_const_char(
                                     "\x06\xc7\x56\xdf\xfc\xd7\x22\x65\x34\x52\xa1\x2d\xcd\x94\x5d\x8c\x54\xda\x2b\x0f\x3c\xbd\x1b"
                                     "\x4d\xc3\xf1\xad\xb2\x23\xae\xb2\x6b\x04\x7c\xd2\x4c\x96\x86\x6f\x97\x9b\x1d\x83\xec\x50\xe2"
                                     "\xb4\xae\x30\xcd\xf2\xfd\xb3\x2b\xd8\xa2\x11\xb8\x37\xdc\x94\xed\xcd\x56\xf4\xd1\x43\x77\x19"
                                     "\x10\x76\xbf\xc5\x9d\x99\xb7\xdd\x30\x53\xef\xd6\xf0\x2c\x44\x34\xf2\xbd\xd2\x7a"),
                                 89);
            value.discriminator = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840U;
            value.iterations    = 1000UL;
            value.salt = chip::ByteSpan(chip::Uint8::from_const_char("SPAKE2P Key Saltgarbage: not in length on purpose"), 16);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "TH_CR1 opens a new commissioning window on DUT_CE using ECM");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            value.PAKEVerifier         = mPakeVerifier.HasValue()
                ? mPakeVerifier.Value()
                : chip::ByteSpan(
                      chip::Uint8::from_const_char(
                          "\xb9\x61\x70\xaa\xe8\x03\x34\x68\x84\x72\x4f\xe9\xa3\xb2\x87\xc3\x03\x30\xc2\xa6\x60\x37\x5d\x17\xbb\x20"
                          "\x5a\x8c\xf1\xae\xcb\x35\x04\x57\xf8\xab\x79\xee\x25\x3a\xb6\xa8\xe4\x6b\xb0\x9e\x54\x3a\xe4\x22\x73\x6d"
                          "\xe5\x01\xe3\xdb\x37\xd4\x41\xfe\x34\x49\x20\xd0\x95\x48\xe4\xc1\x82\x40\x63\x0c\x4f\xf4\x91\x3c\x53\x51"
                          "\x38\x39\xb7\xc0\x7f\xcc\x06\x27\xa1\xb8\x57\x3a\x14\x9f\xcd\x1f\xa4\x66\xcf"),
                      97);
            value.discriminator = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840U;
            value.iterations    = 1000UL;
            value.salt = chip::ByteSpan(chip::Uint8::from_const_char("SPAKE2P Key Saltgarbage: not in length on purpose"), 16);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 15: {
            LogStep(15, "TH_CR1 opens another commissioning window on DUT_CE using ECM");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            value.PAKEVerifier         = mPakeVerifier.HasValue()
                ? mPakeVerifier.Value()
                : chip::ByteSpan(
                      chip::Uint8::from_const_char(
                          "\xb9\x61\x70\xaa\xe8\x03\x34\x68\x84\x72\x4f\xe9\xa3\xb2\x87\xc3\x03\x30\xc2\xa6\x60\x37\x5d\x17\xbb\x20"
                          "\x5a\x8c\xf1\xae\xcb\x35\x04\x57\xf8\xab\x79\xee\x25\x3a\xb6\xa8\xe4\x6b\xb0\x9e\x54\x3a\xe4\x22\x73\x6d"
                          "\xe5\x01\xe3\xdb\x37\xd4\x41\xfe\x34\x49\x20\xd0\x95\x48\xe4\xc1\x82\x40\x63\x0c\x4f\xf4\x91\x3c\x53\x51"
                          "\x38\x39\xb7\xc0\x7f\xcc\x06\x27\xa1\xb8\x57\x3a\x14\x9f\xcd\x1f\xa4\x66\xcf"),
                      97);
            value.discriminator = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840U;
            value.iterations    = 1000UL;
            value.salt = chip::ByteSpan(chip::Uint8::from_const_char("SPAKE2P Key Saltgarbage: not in length on purpose"), 16);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 16: {
            LogStep(16, "TH_CR2 starts a commissioning process with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 17: {
            LogStep(17, "DUT_CE is commissioned by TH_CR2");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            return WaitForCommissionee(kIdentityBeta, value);
        }
        case 18: {
            LogStep(18, "TH_CR1 tries to revoke the commissioning window on DUT_CE using RevokeCommissioning command");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::RevokeCommissioning::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::RevokeCommissioning::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 19: {
            LogStep(19, "TH_CR3 starts a commissioning process with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId3.HasValue() ? mNodeId3.Value() : 12586990ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityGamma, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_6Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_6Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CADMIN_1_6", 19, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
        AddArgument("nodeIdForDuplicateCommissioning", 0, UINT64_MAX, &mNodeIdForDuplicateCommissioning);
        AddArgument("nodeId2", 0, UINT64_MAX, &mNodeId2);
        AddArgument("nodeId3", 0, UINT64_MAX, &mNodeId3);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("discriminator", 0, UINT16_MAX, &mDiscriminator);
        AddArgument("payload", &mPayload);
    }

    ~Test_TC_CADMIN_1_6Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(mTimeout.ValueOr(300)); }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<uint16_t> mTimeout;
    chip::Optional<chip::NodeId> mNodeIdForDuplicateCommissioning;
    chip::Optional<chip::NodeId> mNodeId2;
    chip::Optional<chip::NodeId> mNodeId3;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mDiscriminator;
    chip::Optional<chip::CharSpan> mPayload;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("nodeLabel", value, chip::CharSpan("chiptest", 8)));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            VerifyOrReturn(CheckValue("clusterStatus", status.mClusterStatus.HasValue(), true));
            VerifyOrReturn(CheckValue("clusterStatus", status.mClusterStatus.Value(), 2));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            VerifyOrReturn(CheckValue("clusterStatus", status.mClusterStatus.HasValue(), true));
            VerifyOrReturn(CheckValue("clusterStatus", status.mClusterStatus.Value(), 4));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Precondition: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::FactoryReset::Type value;
            return FactoryReset(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Precondition: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Factory Reset the DUT and enter 'y' after successgarbage: not in length on purpose", 49);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 2: {
            LogStep(2, "TH_CR1 starts a commissioning process with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "TH_CR1 opens a commissioning window on DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Verify that the DNS-SD advertisement shows CM=1");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "Wait for PIXIT.CADMIN.CwDuration + 10");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 190000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6, "TH_CR2 starts a commissioning process with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 7: {
            LogStep(7, "TH_CR1 opens a commissioning window on DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "TH_CR1 revokes the commissioning window on DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::RevokeCommissioning::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::RevokeCommissioning::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "TH_CR2 starts a commissioning process with DUT_CE");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 10: {
            LogStep(10, "TH_CR1 revokes the commissioning window on DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::RevokeCommissioning::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::RevokeCommissioning::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 11: {
            LogStep(11, "TH_CR1 writes the mandatory attribute NodeLabel of DUT_CE");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("chiptestgarbage: not in length on purpose", 8);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::NodeLabel::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "TH_CR1 read the mandatory attribute NodeLabel of DUT_CE");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Basic::Id, Basic::Attributes::NodeLabel::Id, true,
                                 chip::NullOptional);
        }
        case 13: {
            LogStep(13, "TH_CR1 opens a commissioning window on DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "TH_CR1 opens another commissioning window on DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 15: {
            LogStep(15, "TH_CR2 starts a commissioning process on DUT_CE");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 16: {
            LogStep(16, "DUT_CE is commissioned by TH_CR2");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            return WaitForCommissionee(kIdentityBeta, value);
        }
        case 17: {
            LogStep(17, "TH_CR1 tries to revoke the commissioning window on DUT_CE using RevokeCommissioning command");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::RevokeCommissioning::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::RevokeCommissioning::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 18: {
            LogStep(18, "TH_CR3 starts a commissioning process with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId3.HasValue() ? mNodeId3.Value() : 12586990ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityGamma, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_9Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_9Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CADMIN_1_9", 27, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
        AddArgument("nodeIdForDuplicateCommissioning", 0, UINT64_MAX, &mNodeIdForDuplicateCommissioning);
        AddArgument("nodeId2", 0, UINT64_MAX, &mNodeId2);
        AddArgument("nodeId3", 0, UINT64_MAX, &mNodeId3);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("discriminator", 0, UINT16_MAX, &mDiscriminator);
        AddArgument("correctPayload", &mCorrectPayload);
        AddArgument("incorrectSetupCodePayload", &mIncorrectSetupCodePayload);
        AddArgument("PakeVerifier", &mPakeVerifier);
    }

    ~Test_TC_CADMIN_1_9Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(mTimeout.ValueOr(700)); }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<uint16_t> mTimeout;
    chip::Optional<chip::NodeId> mNodeIdForDuplicateCommissioning;
    chip::Optional<chip::NodeId> mNodeId2;
    chip::Optional<chip::NodeId> mNodeId3;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mDiscriminator;
    chip::Optional<chip::CharSpan> mCorrectPayload;
    chip::Optional<chip::CharSpan> mIncorrectSetupCodePayload;
    chip::Optional<chip::ByteSpan> mPakeVerifier;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Precondition: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::FactoryReset::Type value;
            return FactoryReset(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Precondition: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Factory Reset the DUT and enter 'y' after successgarbage: not in length on purpose", 49);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 2: {
            LogStep(2, "TH_CR1 starts a commissioning process with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "TH_CR1 opens a new commissioning window on DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenCommissioningWindow::Type value;
            value.commissioningTimeout = 900U;
            value.PAKEVerifier         = mPakeVerifier.HasValue()
                ? mPakeVerifier.Value()
                : chip::ByteSpan(
                      chip::Uint8::from_const_char(
                          "\x06\xc7\x56\xdf\xfc\xd7\x22\x65\x34\x52\xa1\x2d\xcd\x94\x5d\x8c\x54\xda\x2b\x0f\x3c\xbd\x1b\x4d\xc3\xf1"
                          "\xad\xb2\x23\xae\xb2\x6b\x04\x7c\xd2\x4c\x96\x86\x6f\x97\x9b\x1d\x83\xec\x50\xe2\xb4\xae\x30\xcd\xf2\xfd"
                          "\xb3\x2b\xd8\xa2\x11\xb8\x37\xdc\x94\xed\xcd\x56\xf4\xd1\x43\x77\x19\x10\x76\xbf\xc5\x9d\x99\xb7\xdd\x30"
                          "\x53\xef\xd6\xf0\x2c\x44\x34\xf2\xbd\xd2\x7a\xa4\xf9\xce\xa7\x0d\x73\x8e\x4c"),
                      97);
            value.discriminator = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840U;
            value.iterations    = 1000UL;
            value.salt = chip::ByteSpan(chip::Uint8::from_const_char("SPAKE2P Key Saltgarbage: not in length on purpose"), 16);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Verify that the DNS-SD advertisement shows CM=2");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 6: {
            LogStep(6, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 7: {
            LogStep(7, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 8: {
            LogStep(8, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 9: {
            LogStep(9, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 10: {
            LogStep(10, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 11: {
            LogStep(11, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 12: {
            LogStep(12, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 13: {
            LogStep(13, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 14: {
            LogStep(14, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 15: {
            LogStep(15, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 16: {
            LogStep(16, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 17: {
            LogStep(17, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 18: {
            LogStep(18, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 19: {
            LogStep(19, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 20: {
            LogStep(20, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 21: {
            LogStep(21, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 22: {
            LogStep(22, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 23: {
            LogStep(23, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 24: {
            LogStep(24, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 25: {
            LogStep(25, "TH_CR2 starts a commissioning process with DUT_CE using valid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload =
                mCorrectPayload.HasValue() ? mCorrectPayload.Value() : chip::Span<const char>("MT:-24J0AFN00I31506010", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 26: {
            LogStep(26, "TH_CR3 starts a commissioning process with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId = mNodeId3.HasValue() ? mNodeId3.Value() : 12586990ULL;
            value.payload =
                mCorrectPayload.HasValue() ? mCorrectPayload.Value() : chip::Span<const char>("MT:-24J0AFN00I31506010", 22);
            return PairWithCode(kIdentityGamma, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_10Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_10Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CADMIN_1_10", 26, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
        AddArgument("nodeIdForDuplicateCommissioning", 0, UINT64_MAX, &mNodeIdForDuplicateCommissioning);
        AddArgument("nodeId2", 0, UINT64_MAX, &mNodeId2);
        AddArgument("nodeId3", 0, UINT64_MAX, &mNodeId3);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("discriminator", 0, UINT16_MAX, &mDiscriminator);
        AddArgument("correctPayload", &mCorrectPayload);
        AddArgument("incorrectSetupCodePayload", &mIncorrectSetupCodePayload);
    }

    ~Test_TC_CADMIN_1_10Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(mTimeout.ValueOr(700)); }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<uint16_t> mTimeout;
    chip::Optional<chip::NodeId> mNodeIdForDuplicateCommissioning;
    chip::Optional<chip::NodeId> mNodeId2;
    chip::Optional<chip::NodeId> mNodeId3;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mDiscriminator;
    chip::Optional<chip::CharSpan> mCorrectPayload;
    chip::Optional<chip::CharSpan> mIncorrectSetupCodePayload;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Precondition: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::FactoryReset::Type value;
            return FactoryReset(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Precondition: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Factory Reset the DUT and enter 'y' after successgarbage: not in length on purpose", 49);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 2: {
            LogStep(2, "TH_CR1 starts a commissioning process with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "TH_CR1 opens a commissioning window on DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 900U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Verify that the DNS-SD advertisement shows CM=1");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 6: {
            LogStep(6, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 7: {
            LogStep(7, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 8: {
            LogStep(8, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 9: {
            LogStep(9, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 10: {
            LogStep(10, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 11: {
            LogStep(11, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 12: {
            LogStep(12, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 13: {
            LogStep(13, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 14: {
            LogStep(14, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 15: {
            LogStep(15, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 16: {
            LogStep(16, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 17: {
            LogStep(17, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 18: {
            LogStep(18, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 19: {
            LogStep(19, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 20: {
            LogStep(20, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 21: {
            LogStep(21, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 22: {
            LogStep(22, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 23: {
            LogStep(23, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 24: {
            LogStep(24, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 25: {
            LogStep(25, "TH_CR2 attempts to do PASE to DUT_CE using the correct onboarding payload");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload =
                mCorrectPayload.HasValue() ? mCorrectPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_13Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_13Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CADMIN_1_13", 29, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
        AddArgument("nodeIdForDuplicateCommissioning", 0, UINT64_MAX, &mNodeIdForDuplicateCommissioning);
        AddArgument("nodeId2", 0, UINT64_MAX, &mNodeId2);
        AddArgument("nodeId3", 0, UINT64_MAX, &mNodeId3);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("discriminator", 0, UINT16_MAX, &mDiscriminator);
        AddArgument("payload", &mPayload);
        AddArgument("PakeVerifier", &mPakeVerifier);
    }

    ~Test_TC_CADMIN_1_13Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(mTimeout.ValueOr(600)); }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<uint16_t> mTimeout;
    chip::Optional<chip::NodeId> mNodeIdForDuplicateCommissioning;
    chip::Optional<chip::NodeId> mNodeId2;
    chip::Optional<chip::NodeId> mNodeId3;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mDiscriminator;
    chip::Optional<chip::CharSpan> mPayload;
    chip::Optional<chip::ByteSpan> mPakeVerifier;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatus value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("windowStatus", value, 2U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            VerifyOrReturn(CheckValue("clusterStatus", status.mClusterStatus.HasValue(), true));
            VerifyOrReturn(CheckValue("clusterStatus", status.mClusterStatus.Value(), 2));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::OperationalCredentials::Structs::FabricDescriptor::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 0));
                    VerifyOrReturn(CheckValueAsString("fabrics[0].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 1));
                    VerifyOrReturn(CheckValueAsString("fabrics[1].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 2));
                    VerifyOrReturn(CheckValueAsString("fabrics[2].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("fabrics", iter_0, 3));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatus value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("windowStatus", value, 1U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            VerifyOrReturn(CheckValue("clusterStatus", status.mClusterStatus.HasValue(), true));
            VerifyOrReturn(CheckValue("clusterStatus", status.mClusterStatus.Value(), 2));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::OperationalCredentials::Structs::FabricDescriptor::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 0));
                    VerifyOrReturn(CheckValueAsString("fabrics[0].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 1));
                    VerifyOrReturn(CheckValueAsString("fabrics[1].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 2));
                    VerifyOrReturn(CheckValueAsString("fabrics[2].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("fabrics", iter_0, 3));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            VerifyOrReturn(CheckValue("clusterStatus", status.mClusterStatus.HasValue(), true));
            VerifyOrReturn(CheckValue("clusterStatus", status.mClusterStatus.Value(), 2));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatus value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("windowStatus", value, 0U));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::FabricIndex> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("adminFabricIndex", value));
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("adminVendorId", value));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Precondition: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::FactoryReset::Type value;
            return FactoryReset(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Precondition: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Factory Reset the DUT and enter 'y' after successgarbage: not in length on purpose", 49);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 2: {
            LogStep(2, "TH_CR1 starts a commissioning process with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "TH_CR1 opens a commissioning window on DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "TH_CR1 reads WindowStatus attribute from DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::WindowStatus::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5,
                    "TH_CR1 reads AdminFabricIndex attribute from DUT_CE and Verify TH_CR1 reads the AdminFabricIndex value "
                    "successfully and verify the value to be the same as the Fabric Index of the Fabrics attribute list entry in "
                    "TH_CR1");
            VerifyOrDo(!ShouldSkip("CADMIN.S.A0001 && PICS_USER_PROMPT"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6,
                    "TH_CR1 reads AdminVendorId attribute from DUT_CE and Verify TH_CR1 reads the AdminVendorId value successfully "
                    "and verify this value to be the same as the Vendor ID field of Fabrics attribute list entry in TH_CR1");
            VerifyOrDo(!ShouldSkip("CADMIN.S.A0002 && PICS_USER_PROMPT"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "Verify that the DNS-SD advertisement shows CM=1");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 8: {
            LogStep(8, "TH_CR3 starts a commissioning process with DUT_CE");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId3.HasValue() ? mNodeId3.Value() : 12586990ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityGamma, value);
        }
        case 9: {
            LogStep(9, "DUT_CE is commissioned to TH_CR3 on Fabric ID3 with Node ID3");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId3.HasValue() ? mNodeId3.Value() : 12586990ULL;
            return WaitForCommissionee(kIdentityGamma, value);
        }
        case 10: {
            LogStep(10, "TH_CR1 opens a commissioning window on DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 11: {
            LogStep(11, "TH_CR2 starts a commissioning process with DUT_CE");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 12: {
            LogStep(12, "DUT_CE is commissioned to TH_CR2 on Fabric ID2 with Node ID2");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            return WaitForCommissionee(kIdentityBeta, value);
        }
        case 13: {
            LogStep(13, "TH_CR1 opens a commissioning window on DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "TH_CR1 opens a 2nd commissioning window on DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            value.PAKEVerifier         = mPakeVerifier.HasValue()
                ? mPakeVerifier.Value()
                : chip::ByteSpan(
                      chip::Uint8::from_const_char(
                          "\xb9\x61\x70\xaa\xe8\x03\x34\x68\x84\x72\x4f\xe9\xa3\xb2\x87\xc3\x03\x30\xc2\xa6\x60\x37\x5d\x17\xbb\x20"
                          "\x5a\x8c\xf1\xae\xcb\x35\x04\x57\xf8\xab\x79\xee\x25\x3a\xb6\xa8\xe4\x6b\xb0\x9e\x54\x3a\xe4\x22\x73\x6d"
                          "\xe5\x01\xe3\xdb\x37\xd4\x41\xfe\x34\x49\x20\xd0\x95\x48\xe4\xc1\x82\x40\x63\x0c\x4f\xf4\x91\x3c\x53\x51"
                          "\x38\x39\xb7\xc0\x7f\xcc\x06\x27\xa1\xb8\x57\x3a\x14\x9f\xcd\x1f\xa4\x66\xcf"),
                      97);
            value.discriminator = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840U;
            value.iterations    = 1000UL;
            value.salt = chip::ByteSpan(chip::Uint8::from_const_char("SPAKE2P Key Saltgarbage: not in length on purpose"), 16);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 15: {
            LogStep(15, "TH_CR1 reads the list of Fabrics on DUT_CE");
            VerifyOrDo(!ShouldSkip("OPCREDS.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::Fabrics::Id, false, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Wait for the expiration of PIXIT.CADMIN.CwDuration seconds");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 180000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17, "TH_CR1 re-opens new commissioning window on DUT_CE using ECM");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            value.PAKEVerifier         = mPakeVerifier.HasValue()
                ? mPakeVerifier.Value()
                : chip::ByteSpan(
                      chip::Uint8::from_const_char(
                          "\xb9\x61\x70\xaa\xe8\x03\x34\x68\x84\x72\x4f\xe9\xa3\xb2\x87\xc3\x03\x30\xc2\xa6\x60\x37\x5d\x17\xbb\x20"
                          "\x5a\x8c\xf1\xae\xcb\x35\x04\x57\xf8\xab\x79\xee\x25\x3a\xb6\xa8\xe4\x6b\xb0\x9e\x54\x3a\xe4\x22\x73\x6d"
                          "\xe5\x01\xe3\xdb\x37\xd4\x41\xfe\x34\x49\x20\xd0\x95\x48\xe4\xc1\x82\x40\x63\x0c\x4f\xf4\x91\x3c\x53\x51"
                          "\x38\x39\xb7\xc0\x7f\xcc\x06\x27\xa1\xb8\x57\x3a\x14\x9f\xcd\x1f\xa4\x66\xcf"),
                      97);
            value.discriminator = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840U;
            value.iterations    = 1000UL;
            value.salt = chip::ByteSpan(chip::Uint8::from_const_char("SPAKE2P Key Saltgarbage: not in length on purpose"), 16);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 18: {
            LogStep(18, "TH_CR1 reads WindowStatus attribute from DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::WindowStatus::Id, true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Verify that the DNS-SD advertisement shows CM=2");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 20: {
            LogStep(20, "TH_CR3 opens a 2nd commissioning window on DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            value.PAKEVerifier         = mPakeVerifier.HasValue()
                ? mPakeVerifier.Value()
                : chip::ByteSpan(
                      chip::Uint8::from_const_char(
                          "\xb9\x61\x70\xaa\xe8\x03\x34\x68\x84\x72\x4f\xe9\xa3\xb2\x87\xc3\x03\x30\xc2\xa6\x60\x37\x5d\x17\xbb\x20"
                          "\x5a\x8c\xf1\xae\xcb\x35\x04\x57\xf8\xab\x79\xee\x25\x3a\xb6\xa8\xe4\x6b\xb0\x9e\x54\x3a\xe4\x22\x73\x6d"
                          "\xe5\x01\xe3\xdb\x37\xd4\x41\xfe\x34\x49\x20\xd0\x95\x48\xe4\xc1\x82\x40\x63\x0c\x4f\xf4\x91\x3c\x53\x51"
                          "\x38\x39\xb7\xc0\x7f\xcc\x06\x27\xa1\xb8\x57\x3a\x14\x9f\xcd\x1f\xa4\x66\xcf"),
                      97);
            value.discriminator = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840U;
            value.iterations    = 1000UL;
            value.salt = chip::ByteSpan(chip::Uint8::from_const_char("SPAKE2P Key Saltgarbage: not in length on purpose"), 16);
            return SendCommand(kIdentityGamma, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 21: {
            LogStep(21, "TH_CR1 reads the list of Fabrics on DUT_CE");
            VerifyOrDo(!ShouldSkip("OPCREDS.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::Fabrics::Id, false, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Wait for the expiration of PIXIT_COMM_WIN seconds");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 180000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 23: {
            LogStep(23, "TH_CR1 opens a new commissioning window on DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            value.PAKEVerifier         = mPakeVerifier.HasValue()
                ? mPakeVerifier.Value()
                : chip::ByteSpan(
                      chip::Uint8::from_const_char(
                          "\xb9\x61\x70\xaa\xe8\x03\x34\x68\x84\x72\x4f\xe9\xa3\xb2\x87\xc3\x03\x30\xc2\xa6\x60\x37\x5d\x17\xbb\x20"
                          "\x5a\x8c\xf1\xae\xcb\x35\x04\x57\xf8\xab\x79\xee\x25\x3a\xb6\xa8\xe4\x6b\xb0\x9e\x54\x3a\xe4\x22\x73\x6d"
                          "\xe5\x01\xe3\xdb\x37\xd4\x41\xfe\x34\x49\x20\xd0\x95\x48\xe4\xc1\x82\x40\x63\x0c\x4f\xf4\x91\x3c\x53\x51"
                          "\x38\x39\xb7\xc0\x7f\xcc\x06\x27\xa1\xb8\x57\x3a\x14\x9f\xcd\x1f\xa4\x66\xcf"),
                      97);
            value.discriminator = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840U;
            value.iterations    = 1000UL;
            value.salt = chip::ByteSpan(chip::Uint8::from_const_char("SPAKE2P Key Saltgarbage: not in length on purpose"), 16);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 24: {
            LogStep(24, "TH_CR2 opens a 2nd commissioning window on DUT_CE using ECM");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            value.PAKEVerifier         = mPakeVerifier.HasValue()
                ? mPakeVerifier.Value()
                : chip::ByteSpan(
                      chip::Uint8::from_const_char(
                          "\xb9\x61\x70\xaa\xe8\x03\x34\x68\x84\x72\x4f\xe9\xa3\xb2\x87\xc3\x03\x30\xc2\xa6\x60\x37\x5d\x17\xbb\x20"
                          "\x5a\x8c\xf1\xae\xcb\x35\x04\x57\xf8\xab\x79\xee\x25\x3a\xb6\xa8\xe4\x6b\xb0\x9e\x54\x3a\xe4\x22\x73\x6d"
                          "\xe5\x01\xe3\xdb\x37\xd4\x41\xfe\x34\x49\x20\xd0\x95\x48\xe4\xc1\x82\x40\x63\x0c\x4f\xf4\x91\x3c\x53\x51"
                          "\x38\x39\xb7\xc0\x7f\xcc\x06\x27\xa1\xb8\x57\x3a\x14\x9f\xcd\x1f\xa4\x66\xcf"),
                      97);
            value.discriminator = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840U;
            value.iterations    = 1000UL;
            value.salt = chip::ByteSpan(chip::Uint8::from_const_char("SPAKE2P Key Saltgarbage: not in length on purpose"), 16);
            return SendCommand(kIdentityBeta, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 25: {
            LogStep(25, "Wait for the expiration of PIXIT.CADMIN.CwDuration seconds");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 180000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 26: {
            LogStep(26, "TH_CR1 reads WindowStatus attribute from DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::WindowStatus::Id, true, chip::NullOptional);
        }
        case 27: {
            LogStep(27, "TH_CR1 reads AdminFabricIndex attribute from DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::AdminFabricIndex::Id, true, chip::NullOptional);
        }
        case 28: {
            LogStep(28, "TH_CR1 reads AdminVendorId attribute from DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::AdminVendorId::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_23Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_23Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CADMIN_1_23", 8, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("discriminator", 0, UINT16_MAX, &mDiscriminator);
    }

    ~Test_TC_CADMIN_1_23Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(mTimeout.ValueOr(200)); }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<uint16_t> mTimeout;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mDiscriminator;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatus value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("windowStatus", value, 0U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatus value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("windowStatus", value, 0U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Precondition: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::FactoryReset::Type value;
            return FactoryReset(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Precondition: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Factory Reset the DUT and enter 'y' after successgarbage: not in length on purpose", 49);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 2: {
            LogStep(2, "TH_CR1 starts a commissioning process with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "TH_CR1 opens a commissioning window on DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Wait for commissioning Window to 181 seconds");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 181000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "TH_CR1 reads the window status to verify the DUT_CE window is closed");
            VerifyOrDo(!ShouldSkip("CADMIN.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::WindowStatus::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH_CR1 opens a commissioning window on DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 179U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "TH_CR1 reads the window status to verify the DUT_CE window is closed");
            VerifyOrDo(!ShouldSkip("CADMIN.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::WindowStatus::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_24Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_24Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CADMIN_1_24", 8, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("discriminator", 0, UINT16_MAX, &mDiscriminator);
        AddArgument("PakeVerifier", &mPakeVerifier);
    }

    ~Test_TC_CADMIN_1_24Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(mTimeout.ValueOr(200)); }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<uint16_t> mTimeout;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mDiscriminator;
    chip::Optional<chip::ByteSpan> mPakeVerifier;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatus value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("windowStatus", value, 0U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatus value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("windowStatus", value, 0U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Precondition: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::FactoryReset::Type value;
            return FactoryReset(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Precondition: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Factory Reset the DUT and enter 'y' after successgarbage: not in length on purpose", 49);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 2: {
            LogStep(2, "TH_CR1 starts a commissioning process with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "TH_CR1 opens a commissioning window on DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            value.PAKEVerifier         = mPakeVerifier.HasValue()
                ? mPakeVerifier.Value()
                : chip::ByteSpan(
                      chip::Uint8::from_const_char(
                          "\xb9\x61\x70\xaa\xe8\x03\x34\x68\x84\x72\x4f\xe9\xa3\xb2\x87\xc3\x03\x30\xc2\xa6\x60\x37\x5d\x17\xbb\x20"
                          "\x5a\x8c\xf1\xae\xcb\x35\x04\x57\xf8\xab\x79\xee\x25\x3a\xb6\xa8\xe4\x6b\xb0\x9e\x54\x3a\xe4\x22\x73\x6d"
                          "\xe5\x01\xe3\xdb\x37\xd4\x41\xfe\x34\x49\x20\xd0\x95\x48\xe4\xc1\x82\x40\x63\x0c\x4f\xf4\x91\x3c\x53\x51"
                          "\x38\x39\xb7\xc0\x7f\xcc\x06\x27\xa1\xb8\x57\x3a\x14\x9f\xcd\x1f\xa4\x66\xcf"),
                      97);
            value.discriminator = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840U;
            value.iterations    = 1000UL;
            value.salt = chip::ByteSpan(chip::Uint8::from_const_char("SPAKE2P Key Saltgarbage: not in length on purpose"), 16);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Wait for commissioning Window to 181 seconds");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 181000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "TH_CR1 reads the window status to verify the DUT_CE window is closed");
            VerifyOrDo(!ShouldSkip("CADMIN.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::WindowStatus::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH_CR1 opens a commissioning window on DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenCommissioningWindow::Type value;
            value.commissioningTimeout = 179U;
            value.PAKEVerifier         = mPakeVerifier.HasValue()
                ? mPakeVerifier.Value()
                : chip::ByteSpan(
                      chip::Uint8::from_const_char(
                          "\xb9\x61\x70\xaa\xe8\x03\x34\x68\x84\x72\x4f\xe9\xa3\xb2\x87\xc3\x03\x30\xc2\xa6\x60\x37\x5d\x17\xbb\x20"
                          "\x5a\x8c\xf1\xae\xcb\x35\x04\x57\xf8\xab\x79\xee\x25\x3a\xb6\xa8\xe4\x6b\xb0\x9e\x54\x3a\xe4\x22\x73\x6d"
                          "\xe5\x01\xe3\xdb\x37\xd4\x41\xfe\x34\x49\x20\xd0\x95\x48\xe4\xc1\x82\x40\x63\x0c\x4f\xf4\x91\x3c\x53\x51"
                          "\x38\x39\xb7\xc0\x7f\xcc\x06\x27\xa1\xb8\x57\x3a\x14\x9f\xcd\x1f\xa4\x66\xcf"),
                      97);
            value.discriminator = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840U;
            value.iterations    = 1000UL;
            value.salt = chip::ByteSpan(chip::Uint8::from_const_char("SPAKE2P Key Saltgarbage: not in length on purpose"), 16);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "TH_CR1 reads the window status to verify the DUT_CE window is closed");
            VerifyOrDo(!ShouldSkip("CADMIN.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::WindowStatus::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MOD_1_2Suite : public TestCommand
{
public:
    Test_TC_MOD_1_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_MOD_1_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MOD_1_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MOD_1_3Suite : public TestCommand
{
public:
    Test_TC_MOD_1_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_MOD_1_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MOD_1_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MOD_2_1Suite : public TestCommand
{
public:
    Test_TC_MOD_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_MOD_2_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MOD_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MOD_2_2Suite : public TestCommand
{
public:
    Test_TC_MOD_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_MOD_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MOD_2_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MOD_3_1Suite : public TestCommand
{
public:
    Test_TC_MOD_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_MOD_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MOD_3_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MOD_3_2Suite : public TestCommand
{
public:
    Test_TC_MOD_3_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_MOD_3_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MOD_3_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MOD_3_3Suite : public TestCommand
{
public:
    Test_TC_MOD_3_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_MOD_3_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MOD_3_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MOD_3_4Suite : public TestCommand
{
public:
    Test_TC_MOD_3_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_MOD_3_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MOD_3_4Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SU_1_1Suite : public TestCommand
{
public:
    Test_TC_SU_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SU_1_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SU_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SU_2_1Suite : public TestCommand
{
public:
    Test_TC_SU_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SU_2_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SU_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SU_2_2Suite : public TestCommand
{
public:
    Test_TC_SU_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SU_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SU_2_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SU_2_3Suite : public TestCommand
{
public:
    Test_TC_SU_2_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SU_2_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SU_2_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SU_2_4Suite : public TestCommand
{
public:
    Test_TC_SU_2_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SU_2_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SU_2_4Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SU_2_5Suite : public TestCommand
{
public:
    Test_TC_SU_2_5Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SU_2_5", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SU_2_5Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SU_2_6Suite : public TestCommand
{
public:
    Test_TC_SU_2_6Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SU_2_6", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SU_2_6Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SU_2_7Suite : public TestCommand
{
public:
    Test_TC_SU_2_7Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SU_2_7", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SU_2_7Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SU_2_8Suite : public TestCommand
{
public:
    Test_TC_SU_2_8Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SU_2_8", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SU_2_8Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SU_3_1Suite : public TestCommand
{
public:
    Test_TC_SU_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SU_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SU_3_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SU_3_2Suite : public TestCommand
{
public:
    Test_TC_SU_3_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SU_3_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SU_3_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SU_3_3Suite : public TestCommand
{
public:
    Test_TC_SU_3_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SU_3_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SU_3_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SU_3_4Suite : public TestCommand
{
public:
    Test_TC_SU_3_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SU_3_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SU_3_4Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SU_4_1Suite : public TestCommand
{
public:
    Test_TC_SU_4_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SU_4_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SU_4_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SU_4_2Suite : public TestCommand
{
public:
    Test_TC_SU_4_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SU_4_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SU_4_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_PSCFG_2_2Suite : public TestCommand
{
public:
    Test_TC_PSCFG_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_PSCFG_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_PSCFG_2_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_PSCFG_3_1Suite : public TestCommand
{
public:
    Test_TC_PSCFG_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_PSCFG_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_PSCFG_3_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_1_1Suite : public TestCommand
{
public:
    Test_TC_SC_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_1_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_1_2Suite : public TestCommand
{
public:
    Test_TC_SC_1_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_1_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_1_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_1_3Suite : public TestCommand
{
public:
    Test_TC_SC_1_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_1_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_1_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_1_4Suite : public TestCommand
{
public:
    Test_TC_SC_1_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_1_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_1_4Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_2_1Suite : public TestCommand
{
public:
    Test_TC_SC_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_2_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_2_2Suite : public TestCommand
{
public:
    Test_TC_SC_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_2_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_2_3Suite : public TestCommand
{
public:
    Test_TC_SC_2_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_2_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_2_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_2_4Suite : public TestCommand
{
public:
    Test_TC_SC_2_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_2_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_2_4Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_3_1Suite : public TestCommand
{
public:
    Test_TC_SC_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_3_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_3_2Suite : public TestCommand
{
public:
    Test_TC_SC_3_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_3_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_3_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_3_3Suite : public TestCommand
{
public:
    Test_TC_SC_3_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_3_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_3_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_3_4Suite : public TestCommand
{
public:
    Test_TC_SC_3_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_3_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_3_4Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_3_6Suite : public TestCommand
{
public:
    Test_TC_SC_3_6Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_3_6", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_3_6Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_4_1Suite : public TestCommand
{
public:
    Test_TC_SC_4_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_4_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_4_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_4_2Suite : public TestCommand
{
public:
    Test_TC_SC_4_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_4_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_4_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_4_3Suite : public TestCommand
{
public:
    Test_TC_SC_4_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_4_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_4_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_4_4Suite : public TestCommand
{
public:
    Test_TC_SC_4_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_4_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_4_4Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_4_5Suite : public TestCommand
{
public:
    Test_TC_SC_4_5Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_4_5", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_4_5Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_4_6Suite : public TestCommand
{
public:
    Test_TC_SC_4_6Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_4_6", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_4_6Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_4_7Suite : public TestCommand
{
public:
    Test_TC_SC_4_7Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_4_7", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_4_7Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_4_8Suite : public TestCommand
{
public:
    Test_TC_SC_4_8Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_4_8", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_4_8Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_4_9Suite : public TestCommand
{
public:
    Test_TC_SC_4_9Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_4_9", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_4_9Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_4_10Suite : public TestCommand
{
public:
    Test_TC_SC_4_10Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_4_10", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_4_10Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_5_1Suite : public TestCommand
{
public:
    Test_TC_SC_5_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_5_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_5_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_5_2Suite : public TestCommand
{
public:
    Test_TC_SC_5_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_5_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_5_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_5_3Suite : public TestCommand
{
public:
    Test_TC_SC_5_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_5_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_5_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_6_1Suite : public TestCommand
{
public:
    Test_TC_SC_6_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_6_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_6_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGSW_2_1Suite : public TestCommand
{
public:
    Test_TC_DGSW_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGSW_2_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGSW_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGSW_2_2Suite : public TestCommand
{
public:
    Test_TC_DGSW_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGSW_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGSW_2_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGSW_2_3Suite : public TestCommand
{
public:
    Test_TC_DGSW_2_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGSW_2_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGSW_2_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGSW_3_1Suite : public TestCommand
{
public:
    Test_TC_DGSW_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGSW_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGSW_3_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGSW_3_2Suite : public TestCommand
{
public:
    Test_TC_DGSW_3_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGSW_3_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGSW_3_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGWIFI_2_2Suite : public TestCommand
{
public:
    Test_TC_DGWIFI_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGWIFI_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGWIFI_2_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGWIFI_3_1Suite : public TestCommand
{
public:
    Test_TC_DGWIFI_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGWIFI_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGWIFI_3_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGWIFI_3_2Suite : public TestCommand
{
public:
    Test_TC_DGWIFI_3_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGWIFI_3_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGWIFI_3_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_6_1Suite : public TestCommand
{
public:
    Test_TC_WNCV_6_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_WNCV_6_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_WNCV_6_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_7_1Suite : public TestCommand
{
public:
    Test_TC_WNCV_7_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_WNCV_7_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_WNCV_7_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_FLW_2_2Suite : public TestCommand
{
public:
    Test_TC_FLW_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_FLW_2_2", 4, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_FLW_2_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::app::DataModel::Nullable<uint16_t> ValueBeforeChange;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
                ValueBeforeChange = value;
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
                VerifyOrReturn(CheckConstraintNotValue("value", value, ValueBeforeChange));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read the mandatory attribute: MeasuredValue");
            VerifyOrDo(!ShouldSkip("FLW.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FlowMeasurement::Id,
                                 FlowMeasurement::Attributes::MeasuredValue::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "operate on DUT to change the flow significantly");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && FLW.M.FlowChange"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "Read the mandatory attribute: MeasuredValue");
            VerifyOrDo(!ShouldSkip("FLW.S.A0000 && FLW.M.FlowChange"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FlowMeasurement::Id,
                                 FlowMeasurement::Attributes::MeasuredValue::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_FLW_3_1Suite : public TestCommand
{
public:
    Test_TC_FLW_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_FLW_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_FLW_3_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_OCC_2_2Suite : public TestCommand
{
public:
    Test_TC_OCC_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_OCC_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_OCC_2_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_OCC_2_3Suite : public TestCommand
{
public:
    Test_TC_OCC_2_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_OCC_2_3", 3, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_OCC_2_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 7U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Reads mandatory attribute constrains: OccupancySensorType");
            VerifyOrDo(!ShouldSkip("OCC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OccupancySensing::Id,
                                 OccupancySensing::Attributes::OccupancySensorType::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Reads mandatory attribute constrains: OccupancySensorTypeBitmap");
            VerifyOrDo(!ShouldSkip("OCC.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OccupancySensing::Id,
                                 OccupancySensing::Attributes::OccupancySensorTypeBitmap::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_OCC_2_4Suite : public TestCommand
{
public:
    Test_TC_OCC_2_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_OCC_2_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_OCC_2_4Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_OCC_3_1Suite : public TestCommand
{
public:
    Test_TC_OCC_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_OCC_3_1", 4, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_OCC_3_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    uint8_t OccupancyValue;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                OccupancyValue = value;
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, OccupancyValue));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Reads Occupancy attribute from DUT");
            VerifyOrDo(!ShouldSkip("OCC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OccupancySensing::Id, OccupancySensing::Attributes::Occupancy::Id,
                                 true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Operate on DUT to change the occupancy status");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && OCC.M.OccupancyChange"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "Reads back Occupancy attribute from DUT after few seconds");
            VerifyOrDo(!ShouldSkip("OCC.S.A0000 && OCC.M.OccupancyChange"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OccupancySensing::Id, OccupancySensing::Attributes::Occupancy::Id,
                                 true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_PRS_3_1Suite : public TestCommand
{
public:
    Test_TC_PRS_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_PRS_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_PRS_3_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_PS_2_2Suite : public TestCommand
{
public:
    Test_TC_PS_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_PS_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_PS_2_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_PS_3_1Suite : public TestCommand
{
public:
    Test_TC_PS_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_PS_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_PS_3_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BOOL_2_2Suite : public TestCommand
{
public:
    Test_TC_BOOL_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BOOL_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BOOL_2_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BOOL_3_1Suite : public TestCommand
{
public:
    Test_TC_BOOL_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BOOL_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BOOL_3_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_2_2Suite : public TestCommand
{
public:
    Test_TC_CC_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_2_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_3_4Suite : public TestCommand
{
public:
    Test_TC_CC_3_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_3_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_3_4Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_4_5Suite : public TestCommand
{
public:
    Test_TC_CC_4_5Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_4_5", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_4_5Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_5_4Suite : public TestCommand
{
public:
    Test_TC_CC_5_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_5_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_5_4Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_6_4Suite : public TestCommand
{
public:
    Test_TC_CC_6_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_6_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_6_4Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_7_5Suite : public TestCommand
{
public:
    Test_TC_CC_7_5Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_7_5", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_7_5Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_9_4Suite : public TestCommand
{
public:
    Test_TC_CC_9_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_9_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_9_4Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_3_1Suite : public TestCommand
{
public:
    Test_TC_CC_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_3_1", 51, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_3_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(mTimeout.ValueOr(200)); }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 68U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 92U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 85U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 115U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 102U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 138U));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 102U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 138U));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 166U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 224U));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 115U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 155U));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 115U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 155U));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 68U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 92U));
            }
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 85U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 115U));
            }
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 102U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 138U));
            }
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 102U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 138U));
            }
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 85U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 115U));
            }
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 68U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 92U));
            }
            break;
        case 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 44:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 51U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 69U));
            }
            break;
        case 45:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 51U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 69U));
            }
            break;
        case 47:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorMode", value, 0U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            break;
        case 48:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedColorMode", value, 0U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 49:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 50:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3,
                    "TH sends MoveToHue command to DUT with Hue=60, Direction=0x00 (shortest distance) and TransitionTime=0 "
                    "(immediately)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToHue::Type value;
            value.hue             = 60U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToHue::Id, value,
                               chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(
                5,
                "TH sends MoveToHue command to DUT with Hue=120, Direction=0x00 (shortest distance) and TransitionTime=300 (30s)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToHue::Type value;
            value.hue             = 120U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 300U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToHue::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 11: {
            LogStep(11, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Wait 5s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 14: {
            LogStep(14,
                    "TH sends MoveToHue command to DUT with Hue=60, Direction=0x00 (Shortest distance) and TransitionTime=0 "
                    "(immediately)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToHue::Type value;
            value.hue             = 60U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToHue::Id, value,
                               chip::NullOptional

            );
        }
        case 15: {
            LogStep(15, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 16: {
            LogStep(
                16,
                "TH sends MoveToHue command to DUT with Hue=135, Direction=0x01 (longest distance) and TransitionTime=300 (30s)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToHue::Type value;
            value.hue             = 135U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(1);
            value.transitionTime  = 300U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToHue::Id, value,
                               chip::NullOptional

            );
        }
        case 17: {
            LogStep(17, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 18: {
            LogStep(18, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000 && PICS_SKIP_SAMPLE_APP"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 19: {
            LogStep(19, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 20: {
            LogStep(20, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 21: {
            LogStep(21, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 22: {
            LogStep(22, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 23: {
            LogStep(23, "Wait 5s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 24: {
            LogStep(24, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 25: {
            LogStep(25,
                    "TH sends MoveToHue command to DUT with Hue=60, Direction=0x00 (shortest distance) and TransitionTime=0 "
                    "(immediately).");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToHue::Type value;
            value.hue             = 60U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToHue::Id, value,
                               chip::NullOptional

            );
        }
        case 26: {
            LogStep(26, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 27: {
            LogStep(27, "TH sends MoveToHue command to DUT with Hue=120, Direction=0x02 (up) and TransitionTime=300 (30s)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToHue::Type value;
            value.hue             = 120U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(2);
            value.transitionTime  = 300U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToHue::Id, value,
                               chip::NullOptional

            );
        }
        case 28: {
            LogStep(28, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 29: {
            LogStep(29, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 30: {
            LogStep(30, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 31: {
            LogStep(31, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 32: {
            LogStep(32, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 33: {
            LogStep(33, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 34: {
            LogStep(34, "Wait 5s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 35: {
            LogStep(35, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 36: {
            LogStep(36,
                    "TH sends MoveToHue command to DUT with Hue=120, Direction=0x00 (shortest distance) and TransitionTime=0 "
                    "(immediately)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToHue::Type value;
            value.hue             = 120U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToHue::Id, value,
                               chip::NullOptional

            );
        }
        case 37: {
            LogStep(37, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 38: {
            LogStep(38, "TH sends MoveToHue command to DUT with Hue=60, Direction=0x03 (down) and TransitionTime=300 (30s)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToHue::Type value;
            value.hue             = 60U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(3);
            value.transitionTime  = 300U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToHue::Id, value,
                               chip::NullOptional

            );
        }
        case 39: {
            LogStep(39, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 40: {
            LogStep(40, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 41: {
            LogStep(41, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 42: {
            LogStep(42, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 43: {
            LogStep(43, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 44: {
            LogStep(44, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 45: {
            LogStep(45, "Wait 5s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 46: {
            LogStep(46, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 47: {
            LogStep(47, "TH reads ColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorMode::Id, true,
                                 chip::NullOptional);
        }
        case 48: {
            LogStep(48, "TH reads EnhancedColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedColorMode::Id,
                                 true, chip::NullOptional);
        }
        case 49: {
            LogStep(49, "Turn off light that we turned on");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 50: {
            LogStep(50, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_7_1Suite : public TestCommand
{
public:
    Test_TC_CC_7_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_7_1", 51, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_7_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(mTimeout.ValueOr(200)); }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 6800U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9200U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 8500U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 11500U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 10200U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 13800U));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 10200U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 13800U));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 18700U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 25300U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 34700U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 41300U));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 50700U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 62100U));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 50700U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 62100U));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 6800U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9200U));
            }
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 8500U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 11500U));
            }
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 10200U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 13800U));
            }
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 10200U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 13800U));
            }
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 8500U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 11500U));
            }
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 6800U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9200U));
            }
            break;
        case 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 44:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 5100U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 6900U));
            }
            break;
        case 45:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 5100U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 6900U));
            }
            break;
        case 47:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorMode", value, 0U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            break;
        case 48:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedColorMode", value, 3U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 49:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 50:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3,
                    "TH sends EnhancedMoveToHue command to DUT with EnhancedHue=6000, Direction=0x00 (shortest distance) and "
                    "TransitionTime=0 (immediately)");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveToHue::Type value;
            value.enhancedHue     = 6000U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveToHue::Id,
                               value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5,
                    "TH sends EnhancedMoveToHue command to DUT with EnhancedHue=12000, Direction=0x00 (shortest distance) and "
                    "TransitionTime=300 (30s).");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveToHue::Type value;
            value.enhancedHue     = 12000U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 300U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveToHue::Id,
                               value, chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 11: {
            LogStep(11, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Wait 5s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 14: {
            LogStep(14,
                    "TH sends EnhancedMoveToHue command to DUT with EnhancedHue=6000, Direction=0x00 (shortest distance) and "
                    "TransitionTime=0 (immediately)");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveToHue::Type value;
            value.enhancedHue     = 6000U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveToHue::Id,
                               value, chip::NullOptional

            );
        }
        case 15: {
            LogStep(15, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 16: {
            LogStep(16,
                    "TH sends EnhancedMoveToHue command to DUT with EnhancedHue=54000, Direction=0x01 (longest distance) and "
                    "TransitionTime=300 (30s)");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveToHue::Type value;
            value.enhancedHue     = 54000U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(1);
            value.transitionTime  = 300U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveToHue::Id,
                               value, chip::NullOptional

            );
        }
        case 17: {
            LogStep(17, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 18: {
            LogStep(18, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 20: {
            LogStep(20, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 22: {
            LogStep(22, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "Wait 5s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 24: {
            LogStep(24, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 25: {
            LogStep(25,
                    "TH sends EnhancedMoveToHue command to DUT with EnhancedHue=6000, Direction=0x00 (shortest distance) and "
                    "TransitionTime=0 (immediately)");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveToHue::Type value;
            value.enhancedHue     = 6000U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveToHue::Id,
                               value, chip::NullOptional

            );
        }
        case 26: {
            LogStep(26, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 27: {
            LogStep(27,
                    "TH sends EnhancedMoveToHue command to DUT with EnhancedHue=12000, Direction=0x02 (up) and TransitionTime=300 "
                    "(30s)");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveToHue::Type value;
            value.enhancedHue     = 12000U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(2);
            value.transitionTime  = 300U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveToHue::Id,
                               value, chip::NullOptional

            );
        }
        case 28: {
            LogStep(28, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 29: {
            LogStep(29, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 30: {
            LogStep(30, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 31: {
            LogStep(31, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 32: {
            LogStep(32, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 33: {
            LogStep(33, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 34: {
            LogStep(34, "Wait 5s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 35: {
            LogStep(35, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 36: {
            LogStep(36,
                    "TH sends EnhancedMoveToHue command to DUT with EnhancedHue=12000, Direction=0x00 (shortest distance) and "
                    "TransitionTime=0 (immediately)");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveToHue::Type value;
            value.enhancedHue     = 12000U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveToHue::Id,
                               value, chip::NullOptional

            );
        }
        case 37: {
            LogStep(37, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 38: {
            LogStep(38,
                    "TH sends EnhancedMoveToHue command to DUT with EnhancedHue=6000, Direction=0x03 (down) and TransitionTime=300 "
                    "(30s).");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveToHue::Type value;
            value.enhancedHue     = 6000U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(3);
            value.transitionTime  = 300U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveToHue::Id,
                               value, chip::NullOptional

            );
        }
        case 39: {
            LogStep(39, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 40: {
            LogStep(40, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 41: {
            LogStep(41, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 42: {
            LogStep(42, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 43: {
            LogStep(43, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 44: {
            LogStep(44, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 45: {
            LogStep(45, "Wait 5s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 46: {
            LogStep(46, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 47: {
            LogStep(47, "TH reads ColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorMode::Id, true,
                                 chip::NullOptional);
        }
        case 48: {
            LogStep(48, "TH reads EnhancedColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedColorMode::Id,
                                 true, chip::NullOptional);
        }
        case 49: {
            LogStep(49, "Turn Off light that we turned on");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 50: {
            LogStep(50, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_9_1Suite : public TestCommand
{
public:
    Test_TC_CC_9_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_9_1", 72, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
    }

    ~Test_TC_CC_9_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(mTimeout.ValueOr(400)); }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<uint16_t> mTimeout;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;

    uint16_t ColorLoopStartEnhancedHueStep5d;
    uint16_t ColorLoopStoredEnhancedHueStep6c;
    uint16_t ColorLoopStartEnhancedHueStep8d;
    uint16_t ColorLoopStoredEnhancedHueStep9c;
    uint16_t ColorLoopStartEnhancedHueStep12d;
    uint16_t ColorLoopStoredEnhancedHueStep13c;
    uint16_t ColorLoopStartEnhancedHueStep15d;
    uint16_t ColorLoopStoredEnhancedHueStep16b;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopActive", value, 0U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopDirection", value, 0U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopTime", value, 30U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopStartEnhancedHue", value, 160U));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopActive", value, 1U));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopStoredEnhancedHue", value, 16384U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                ColorLoopStartEnhancedHueStep5d = value;
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorLoopStartEnhancedHueStep5d));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorLoopStartEnhancedHueStep5d));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopActive", value, 0U));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                ColorLoopStoredEnhancedHueStep6c = value;
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedCurrentHue", value, ColorLoopStoredEnhancedHueStep6c));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopDirection", value, 1U));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopActive", value, 1U));
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopStoredEnhancedHue", value, 16384U));
            }
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                ColorLoopStartEnhancedHueStep8d = value;
            }
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorLoopStartEnhancedHueStep8d));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorLoopStartEnhancedHueStep8d));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopActive", value, 0U));
            }
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                ColorLoopStoredEnhancedHueStep9c = value;
            }
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedCurrentHue", value, ColorLoopStoredEnhancedHueStep9c));
            }
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedCurrentHue", value, 16384U));
            }
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopDirection", value, 0U));
            }
            break;
        case 44:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 45:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopActive", value, 1U));
            }
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopStoredEnhancedHue", value, 16384U));
            }
            break;
        case 47:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 48:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                ColorLoopStartEnhancedHueStep12d = value;
            }
            break;
        case 49:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorLoopStartEnhancedHueStep12d));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 50:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 51:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorLoopStartEnhancedHueStep12d));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 52:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 53:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopActive", value, 0U));
            }
            break;
        case 54:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                ColorLoopStoredEnhancedHueStep13c = value;
            }
            break;
        case 55:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedCurrentHue", value, ColorLoopStoredEnhancedHueStep13c));
            }
            break;
        case 56:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 57:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopDirection", value, 1U));
            }
            break;
        case 58:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 59:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopActive", value, 1U));
            }
            break;
        case 60:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopStoredEnhancedHue", value, 16384U));
            }
            break;
        case 61:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 62:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                ColorLoopStartEnhancedHueStep15d = value;
            }
            break;
        case 63:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorLoopStartEnhancedHueStep15d));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 64:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 65:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorLoopStartEnhancedHueStep15d));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 66:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 67:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopActive", value, 0U));
            }
            break;
        case 68:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                ColorLoopStoredEnhancedHueStep16b = value;
            }
            break;
        case 69:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedCurrentHue", value, ColorLoopStoredEnhancedHueStep16b));
            }
            break;
        case 70:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 71:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.A000f && CC.S.F02 && CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3,
                    "TH sends EnhancedMoveToHue command to DUT with EnhancedHue=0x4000, Direction=0x00 (shortest distance) and "
                    "TransitionTime=0 (immediately).");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveToHue::Type value;
            value.enhancedHue     = 16384U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveToHue::Id,
                               value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Wait for 1000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x1 (UpdateAction) and Action attribute to 0x0 "
                    "(De-activate) to DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(1U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Read ColorLoopActive attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4002 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id,
                                 true, chip::NullOptional);
        }
        case 7: {
            LogStep(7,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x2 (UpdateDirection) and Direction attribute "
                    "to 0x0 (decrement hue) to DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(2U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "Read ColorLoopDirection attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4003 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopDirection::Id,
                                 true, chip::NullOptional);
        }
        case 9: {
            LogStep(9,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x4 (UpdateTime) and Time attribute to 30 (30s "
                    "for one loop) to DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(4U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 30U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 10: {
            LogStep(10, "Read ColorLoopTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4004 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopTime::Id,
                                 true, chip::NullOptional);
        }
        case 11: {
            LogStep(11,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x8 (UpdateStartHue) and StartHue attribute to "
                    "0x00A0 to DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(8U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 160U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "Read ColorLoopStartEnhancedHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4005 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStartEnhancedHue::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x1 (UpdateAction) and Action attribute to 0x1 "
                    "(start from ColorLoopStartEnhancedHue) to DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(1U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(1);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "Read ColorLoopActive attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4002 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id,
                                 true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Read ColorLoopStoredEnhancedHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4006 && CC.S.C40.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStoredEnhancedHue::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Wait for 30S");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 30000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17, "Saving value for comparison in step 8d read ColorLoopStartEnhancedHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4005 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStartEnhancedHue::Id, true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Read EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4000 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Wait for 30S");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 30000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 20: {
            LogStep(20, "Read EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4000 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 21: {
            LogStep(21,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x1 (UpdateAction) and Action attribute to 0x0 "
                    "(De-activate) to DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(1U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 22: {
            LogStep(22, "Read ColorLoopActive attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4002 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id,
                                 true, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "Saving value for comparison in step 6c read ColorLoopStoredEnhancedHue attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4006 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStoredEnhancedHue::Id, true, chip::NullOptional);
        }
        case 24: {
            LogStep(24, "Read EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4000 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 25: {
            LogStep(25,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x2 (UpdateDirection) and Direction attribute "
                    "to 0x1 (increment hue) to DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(2U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(1);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 26: {
            LogStep(26, "Read ColorLoopDirection attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4003 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopDirection::Id,
                                 true, chip::NullOptional);
        }
        case 27: {
            LogStep(27,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x1 (UpdateAction) and Action attribute to 0x1 "
                    "(start from ColorLoopStartEnhancedHue) to DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(1U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(1);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 28: {
            LogStep(28, "Read ColorLoopActive attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4002 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id,
                                 true, chip::NullOptional);
        }
        case 29: {
            LogStep(29, "Read ColorLoopStoredEnhancedHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4006 && CC.S.C40.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStoredEnhancedHue::Id, true, chip::NullOptional);
        }
        case 30: {
            LogStep(30, "Wait for 30S");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 30000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 31: {
            LogStep(31, "Saving value for comparision in step 8d read ColorLoopStartEnhancedHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4005 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStartEnhancedHue::Id, true, chip::NullOptional);
        }
        case 32: {
            LogStep(32, "Read EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4000 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 33: {
            LogStep(33, "Wait for 30S");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 30000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 34: {
            LogStep(34, "Read EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4000 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 35: {
            LogStep(35,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x1 (UpdateAction) and Action attribute to 0x0 "
                    "(De-activate) to DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(1U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 36: {
            LogStep(36, "Read ColorLoopActive attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4002 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id,
                                 true, chip::NullOptional);
        }
        case 37: {
            LogStep(37, "Saving value for comparision in step 9c read ColorLoopStoredEnhancedHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4006 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStoredEnhancedHue::Id, true, chip::NullOptional);
        }
        case 38: {
            LogStep(38, "Read EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4000 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 39: {
            LogStep(39,
                    "TH sends EnhancedMoveToHue command to DUT with EnhancedHue=0x4000, Direction=0x00 (shortest distance) and "
                    "TransitionTime=0 (immediately).");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveToHue::Type value;
            value.enhancedHue     = 16384U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveToHue::Id,
                               value, chip::NullOptional

            );
        }
        case 40: {
            LogStep(40, "Wait 1000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 41: {
            LogStep(41, "Read EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4000 && CC.S.C40.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 42: {
            LogStep(42,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x2 (UpdateDirection) and Direction attribute "
                    "to 0x0 (decrement hue) to DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(2U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 43: {
            LogStep(43, "Read ColorLoopDirection attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4003 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopDirection::Id,
                                 true, chip::NullOptional);
        }
        case 44: {
            LogStep(44,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x1 (UpdateAction) and Action attribute to 0x2 "
                    "(start from EnhancedCurrentHue) to DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(1U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(2);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 45: {
            LogStep(45, "Read ColorLoopActive attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4002 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id,
                                 true, chip::NullOptional);
        }
        case 46: {
            LogStep(46, "Read ColorLoopStoredEnhancedHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4006 && CC.S.C40.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStoredEnhancedHue::Id, true, chip::NullOptional);
        }
        case 47: {
            LogStep(47, "Wait for 30S");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 30000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 48: {
            LogStep(48, "Saving value for comparision in step 12d read ColorLoopStartEnhancedHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4005 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStartEnhancedHue::Id, true, chip::NullOptional);
        }
        case 49: {
            LogStep(49, "Read EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4000 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 50: {
            LogStep(50, "Wait for 30S");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 30000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 51: {
            LogStep(51, "Read EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4000 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 52: {
            LogStep(52,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x1 (UpdateAction) and Action attribute to 0x0 "
                    "(De-activate) to DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(1U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 53: {
            LogStep(53, "Read ColorLoopActive attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4002 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id,
                                 true, chip::NullOptional);
        }
        case 54: {
            LogStep(54, "Saving value for comparision in step 13c read ColorLoopStoredEnhancedHue attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4006 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStoredEnhancedHue::Id, true, chip::NullOptional);
        }
        case 55: {
            LogStep(55, "Read EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4000 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 56: {
            LogStep(56,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x2 (UpdateDirection) and Direction attribute "
                    "to 0x1 (increment hue) to DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(2U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(1);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 57: {
            LogStep(57, "Read ColorLoopDirection attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4003 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopDirection::Id,
                                 true, chip::NullOptional);
        }
        case 58: {
            LogStep(58,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x1 (UpdateAction) and Action attribute to 0x2 "
                    "(start from EnhancedCurrentHue) to DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(1U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(2);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 59: {
            LogStep(59, "Read ColorLoopActive attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4002 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id,
                                 true, chip::NullOptional);
        }
        case 60: {
            LogStep(60, "Read ColorLoopStoredEnhancedHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4006 && CC.S.C40.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStoredEnhancedHue::Id, true, chip::NullOptional);
        }
        case 61: {
            LogStep(61, "Wait for 30S");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 30000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 62: {
            LogStep(62, "Saving value for comparision in step 15d read ColorLoopStartEnhancedHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4005 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStartEnhancedHue::Id, true, chip::NullOptional);
        }
        case 63: {
            LogStep(63, "Read EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4000 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 64: {
            LogStep(64, "Wait for 30S");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 30000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 65: {
            LogStep(65, "Read EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4000 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 66: {
            LogStep(66,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x1 (UpdateAction) and Action attribute to 0x0 "
                    "(De-activate) to DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(1U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 67: {
            LogStep(67, "Read ColorLoopActive attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4002 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id,
                                 true, chip::NullOptional);
        }
        case 68: {
            LogStep(68, "Saving value for comparision in step 16b read ColorLoopStoredEnhancedHue attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4006 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStoredEnhancedHue::Id, true, chip::NullOptional);
        }
        case 69: {
            LogStep(69, "Read EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4000 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 70: {
            LogStep(70, "Turn Off light for color control tests");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 71: {
            LogStep(71, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_9_2Suite : public TestCommand
{
public:
    Test_TC_CC_9_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_9_2", 31, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_9_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(mTimeout.ValueOr(400)); }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    uint16_t ColorLoopStartEnhancedHueValue;
    uint16_t ColorLoopStartEnhancedHue;
    uint16_t ColorLoopStoredEnhancedHueValue;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopActive", value, 0U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopDirection", value, 0U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopTime", value, 30U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopStartEnhancedHue", value, 160U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopActive", value, 1U));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopStoredEnhancedHue", value, 16384U));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                ColorLoopStartEnhancedHueValue = value;
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorLoopStartEnhancedHueValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorLoopStartEnhancedHueValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopDirection", value, 1U));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                ColorLoopStartEnhancedHue = value;
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorLoopStartEnhancedHue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorLoopStartEnhancedHue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopActive", value, 0U));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                ColorLoopStoredEnhancedHueValue = value;
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedCurrentHue", value, ColorLoopStoredEnhancedHueValue));
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.A000f && CC.S.F02 && CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3,
                    "TH sends EnhancedMoveToHue command to DUT with EnhancedHue=0x4000, Direction=0x00 (shortest distance) and "
                    "TransitionTime=0 (immediately).");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveToHue::Type value;
            value.enhancedHue     = 16384U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveToHue::Id,
                               value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Wait for 1000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0xF, Action attribute to 0x0 (De-activate), "
                    "Direction attribute to 0x0 (decrement hue), Time attribute to 30, and StartHue attribute to 0x00A0 to DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(15U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 30U;
            value.startHue        = 160U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Read ColorLoopActive attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4002 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id,
                                 true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read ColorLoopDirection attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4003 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopDirection::Id,
                                 true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read ColorLoopTime attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4004 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopTime::Id,
                                 true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Read ColorLoopStartEnhancedHue attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4005 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStartEnhancedHue::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x1 (UpdateAction) and Action attribute to 0x1 "
                    "(start from ColorLoopStartEnhancedHue) to DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(1U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(1);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 11: {
            LogStep(11, "Read ColorLoopActive attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4002 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id,
                                 true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Read ColorLoopStoredEnhancedHue attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4006 && CC.S.C40.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStoredEnhancedHue::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Wait for 30S");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 30000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14, "Saving value for comparision read ColorLoopStartEnhancedHue attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4005 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStartEnhancedHue::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Read EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4000 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Wait for 30S");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 30000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17, "Read EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4000 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 18: {
            LogStep(18,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x2 (UpdateDirection) and Direction attribute "
                    "to 0x1 (increment hue) to DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(2U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(1);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 19: {
            LogStep(19, "Read ColorLoopDirection attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4003 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopDirection::Id,
                                 true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Wait for 30S");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 30000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 21: {
            LogStep(21, "Saving value for comparision read ColorLoopStartEnhancedHue attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4005 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStartEnhancedHue::Id, true, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Read EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4000 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "Wait for 30S");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 30000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 24: {
            LogStep(24, "Read EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4000 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 25: {
            LogStep(25,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x1 (UpdateAction) and Action attribute to 0x0 "
                    "(De-activate) to DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(1U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 26: {
            LogStep(26, "Read ColorLoopActive attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4002 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id,
                                 true, chip::NullOptional);
        }
        case 27: {
            LogStep(27, "Saving value for comparision read ColorLoopStoredEnhancedHue attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4006 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStoredEnhancedHue::Id, true, chip::NullOptional);
        }
        case 28: {
            LogStep(28, "Read EnhancedCurrentHue attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4000 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 29: {
            LogStep(29, "Turn off light for color control tests");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 30: {
            LogStep(30, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_9_3Suite : public TestCommand
{
public:
    Test_TC_CC_9_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_9_3", 30, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_9_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(mTimeout.ValueOr(400)); }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    uint16_t ColorLoopStartEnhancedHueValue;
    uint16_t ColorLoopStoredEnhancedHueValue;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopActive", value, 0U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopDirection", value, 0U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopTime", value, 30U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopStartEnhancedHue", value, 160U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopActive", value, 1U));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopStoredEnhancedHue", value, 16384U));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                ColorLoopStartEnhancedHueValue = value;
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorLoopStartEnhancedHueValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorLoopStartEnhancedHueValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopTime", value, 60U));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopActive", value, 0U));
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                ColorLoopStoredEnhancedHueValue = value;
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedCurrentHue", value, ColorLoopStoredEnhancedHueValue));
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.A000f && CC.S.F02 && CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3,
                    "TH sends EnhancedMoveToHue command to DUT with EnhancedHue=0x4000, Direction=0x00 (shortest distance) and "
                    "TransitionTime=0 (immediately).");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveToHue::Type value;
            value.enhancedHue     = 16384U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveToHue::Id,
                               value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Wait for 1000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0xF, Action attribute to 0x0 (De-activate), "
                    "Direction attribute to 0x0 (decrement hue), Time attribute to 30, and StartHue attribute to 0x00A0 to DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(15U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 30U;
            value.startHue        = 160U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Read ColorLoopActive attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4002 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id,
                                 true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read ColorLoopDirection attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4003 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopDirection::Id,
                                 true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read ColorLoopTime attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4004 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopTime::Id,
                                 true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Read ColorLoopStartEnhancedHue attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4005 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStartEnhancedHue::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x1 (UpdateAction) and Action attribute to 0x1 "
                    "(start from ColorLoopStartEnhancedHue) to DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(1U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(1);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 11: {
            LogStep(11, "Read ColorLoopActive attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4002 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id,
                                 true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Read ColorLoopStoredEnhancedHue attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4006 && CC.S.C40.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStoredEnhancedHue::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Wait for 30S");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 30000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14, "Saving value for comparision read ColorLoopStartEnhancedHue attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4005 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStartEnhancedHue::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Read EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4000 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Wait for 30S");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 30000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17, "Read EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4000 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x4 and Time attribute to 60 to DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(4U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 60U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 19: {
            LogStep(19, "Read ColorLoopTime attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4004 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopTime::Id,
                                 true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Wait for 60S");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 60000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 21: {
            LogStep(21, "Read EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4000 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Wait for 60S");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 60000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 23: {
            LogStep(23, "Read EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4000 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 24: {
            LogStep(24,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x1 (UpdateAction) and Action attribute to 0x0 "
                    "(De-activate) to DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(1U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 25: {
            LogStep(25, "Read ColorLoopActive attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4002 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id,
                                 true, chip::NullOptional);
        }
        case 26: {
            LogStep(26, "Saving value for comparision read ColorLoopStoredEnhancedHue attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4006 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStoredEnhancedHue::Id, true, chip::NullOptional);
        }
        case 27: {
            LogStep(27, "Read EnhancedCurrentHue attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4000 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 28: {
            LogStep(28, "Turn off light for color control tests");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 29: {
            LogStep(29, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DRLK_2_1Suite : public TestCommand
{
public:
    Test_TC_DRLK_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DRLK_2_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DRLK_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DRLK_2_6Suite : public TestCommand
{
public:
    Test_TC_DRLK_2_6Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DRLK_2_6", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DRLK_2_6Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DRLK_2_8Suite : public TestCommand
{
public:
    Test_TC_DRLK_2_8Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DRLK_2_8", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DRLK_2_8Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DRLK_2_10Suite : public TestCommand
{
public:
    Test_TC_DRLK_2_10Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DRLK_2_10", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DRLK_2_10Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DRLK_3_1Suite : public TestCommand
{
public:
    Test_TC_DRLK_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DRLK_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DRLK_3_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DRLK_3_2Suite : public TestCommand
{
public:
    Test_TC_DRLK_3_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DRLK_3_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DRLK_3_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DRLK_3_3Suite : public TestCommand
{
public:
    Test_TC_DRLK_3_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DRLK_3_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DRLK_3_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_LCFG_2_1Suite : public TestCommand
{
public:
    Test_TC_LCFG_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LCFG_2_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_LCFG_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_LCFG_3_1Suite : public TestCommand
{
public:
    Test_TC_LCFG_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LCFG_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_LCFG_3_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_LVL_2_3Suite : public TestCommand
{
public:
    Test_TC_LVL_2_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LVL_2_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_LVL_2_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_LVL_7_1Suite : public TestCommand
{
public:
    Test_TC_LVL_7_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LVL_7_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_LVL_7_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_LVL_8_1Suite : public TestCommand
{
public:
    Test_TC_LVL_8_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LVL_8_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_LVL_8_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_OO_2_3Suite : public TestCommand
{
public:
    Test_TC_OO_2_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_OO_2_3", 133, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
    }

    ~Test_TC_OO_2_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(mTimeout.ValueOr(400)); }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<uint16_t> mTimeout;
    chip::Optional<chip::EndpointId> mEndpoint;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("globalSceneControl", value, 1));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("globalSceneControl", value, 0));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("globalSceneControl", value, 1));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("globalSceneControl", value, 0));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("globalSceneControl", value, 1));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("globalSceneControl", value, 0));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("globalSceneControl", value, 1));
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("globalSceneControl", value, 1));
            }
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onTime", value, 0U));
            }
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("offWaitTime", value, 0U));
            }
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 255U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 345U));
            }
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("offWaitTime", value, 300U));
            }
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 44:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 45:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 47:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 255U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 345U));
            }
            break;
        case 48:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("offWaitTime", value, 300U));
            }
            break;
        case 49:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 50:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 51:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 52:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onTime", value, 0U));
            }
            break;
        case 53:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 255U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 345U));
            }
            break;
        case 54:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 55:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 56:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 57:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onTime", value, 0U));
            }
            break;
        case 58:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 170U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 230U));
            }
            break;
        case 59:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 60:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 61:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 62:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onTime", value, 0U));
            }
            break;
        case 63:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("offWaitTime", value, 0U));
            }
            break;
        case 64:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 65:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 66:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 67:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 68:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 69:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onTime", value, 0U));
            }
            break;
        case 70:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 255U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 345U));
            }
            break;
        case 71:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 72:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 73:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onTime", value, 0U));
            }
            break;
        case 74:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("offWaitTime", value, 0U));
            }
            break;
        case 75:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 76:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 77:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 78:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onTime", value, 0U));
            }
            break;
        case 79:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("offWaitTime", value, 0U));
            }
            break;
        case 80:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 81:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 82:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 83:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 84:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 255U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 345U));
            }
            break;
        case 85:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("offWaitTime", value, 300U));
            }
            break;
        case 86:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 87:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 88:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onTime", value, 0U));
            }
            break;
        case 89:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("offWaitTime", value, 0U));
            }
            break;
        case 90:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 91:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 92:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 93:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 255U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 345U));
            }
            break;
        case 94:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("offWaitTime", value, 300U));
            }
            break;
        case 95:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 96:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 97:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 98:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 99:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 100:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 170U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 230U));
            }
            break;
        case 101:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("offWaitTime", value, 300U));
            }
            break;
        case 102:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 103:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 104:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onTime", value, 0U));
            }
            break;
        case 105:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 255U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 345U));
            }
            break;
        case 106:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 107:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 108:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 109:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onTime", value, 0U));
            }
            break;
        case 110:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 170U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 230U));
            }
            break;
        case 111:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 112:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 113:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onTime", value, 0U));
            }
            break;
        case 114:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("offWaitTime", value, 0U));
            }
            break;
        case 115:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 116:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 117:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 118:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 119:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onTime", value, 0U));
            }
            break;
        case 120:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 255U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 345U));
            }
            break;
        case 121:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 122:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 123:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onTime", value, 0U));
            }
            break;
        case 124:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("offWaitTime", value, 0U));
            }
            break;
        case 125:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 126:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 127:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 255U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 345U));
            }
            break;
        case 128:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("offWaitTime", value, 300U));
            }
            break;
        case 129:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 130:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 131:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onTime", value, 0U));
            }
            break;
        case 132:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("offWaitTime", value, 0U));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "1: Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "2a: Send On Command");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Wait 1000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "2b: Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "2b:Reads GlobalSceneControl attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::GlobalSceneControl::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "3a:Sends OffWithEffect command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::OffWithEffect::Type value;
            value.effectId      = static_cast<chip::app::Clusters::OnOff::OnOffEffectIdentifier>(0);
            value.effectVariant = static_cast<chip::app::Clusters::OnOff::OnOffDelayedAllOffEffectVariant>(0);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::OffWithEffect::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Wait 1000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "3b:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "3b:Reads GlobalSceneControl attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4000 && OO.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::GlobalSceneControl::Id, true,
                                 chip::NullOptional);
        }
        case 9: {
            LogStep(9, "4a:Sends OnWithRecallGlobalScene command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::OnWithRecallGlobalScene::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::OnWithRecallGlobalScene::Id, value,
                               chip::NullOptional

            );
        }
        case 10: {
            LogStep(10, "Wait 1000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 11: {
            LogStep(11, "4b:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "4b:Reads GlobalSceneControl attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4000 && OO.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::GlobalSceneControl::Id, true,
                                 chip::NullOptional);
        }
        case 13: {
            LogStep(13, "5a:Sends OffWithEffect command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::OffWithEffect::Type value;
            value.effectId      = static_cast<chip::app::Clusters::OnOff::OnOffEffectIdentifier>(0);
            value.effectVariant = static_cast<chip::app::Clusters::OnOff::OnOffDelayedAllOffEffectVariant>(0);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::OffWithEffect::Id, value,
                               chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "Wait 1000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 15: {
            LogStep(15, "5b:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 &&  OO.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "5b:Reads GlobalSceneControl attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4000 && OO.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::GlobalSceneControl::Id, true,
                                 chip::NullOptional);
        }
        case 17: {
            LogStep(17, "5c:Send On Command");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 18: {
            LogStep(18, "Wait 1000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 19: {
            LogStep(19, "5d:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "5d:Reads GlobalSceneControl attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4000 && OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::GlobalSceneControl::Id, true,
                                 chip::NullOptional);
        }
        case 21: {
            LogStep(21, "6a:Sends OffWithEffect command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::OffWithEffect::Type value;
            value.effectId      = static_cast<chip::app::Clusters::OnOff::OnOffEffectIdentifier>(1);
            value.effectVariant = static_cast<chip::app::Clusters::OnOff::OnOffDelayedAllOffEffectVariant>(0);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::OffWithEffect::Id, value,
                               chip::NullOptional

            );
        }
        case 22: {
            LogStep(22, "Wait 1000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 23: {
            LogStep(23, "6b:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 24: {
            LogStep(24, "6b:Reads GlobalSceneControl attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4000 && OO.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::GlobalSceneControl::Id, true,
                                 chip::NullOptional);
        }
        case 25: {
            LogStep(25, "7a:Send On Command");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 26: {
            LogStep(26, "Wait 1000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 27: {
            LogStep(27, "7b:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 28: {
            LogStep(28, "7b:Reads GlobalSceneControl attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4000 && OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::GlobalSceneControl::Id, true,
                                 chip::NullOptional);
        }
        case 29: {
            LogStep(29, "7c:Sends OnWithRecallGlobalScene command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::OnWithRecallGlobalScene::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::OnWithRecallGlobalScene::Id, value,
                               chip::NullOptional

            );
        }
        case 30: {
            LogStep(30, "Wait 1000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 31: {
            LogStep(31, "7d:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 32: {
            LogStep(32, "7d:Reads GlobalSceneControl attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4000 && OO.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::GlobalSceneControl::Id, true,
                                 chip::NullOptional);
        }
        case 33: {
            LogStep(33, "8:Reads OnTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnTime::Id, true,
                                 chip::NullOptional);
        }
        case 34: {
            LogStep(34, "8:Reads OffWaitTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OffWaitTime::Id, true,
                                 chip::NullOptional);
        }
        case 35: {
            LogStep(35, "9a:Sends OnWithTimedOff command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::OnWithTimedOff::Type value;
            value.onOffControl = static_cast<chip::BitMask<chip::app::Clusters::OnOff::OnOffControl>>(1U);
            value.onTime       = 300U;
            value.offWaitTime  = 300U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::OnWithTimedOff::Id, value,
                               chip::NullOptional

            );
        }
        case 36: {
            LogStep(36, "9b:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 37: {
            LogStep(37, "9b:Reads OnTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4001 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnTime::Id, true,
                                 chip::NullOptional);
        }
        case 38: {
            LogStep(38, "9b:Reads OffWaitTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4002 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OffWaitTime::Id, true,
                                 chip::NullOptional);
        }
        case 39: {
            LogStep(39, "10a:Sends OnWithTimedOff command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::OnWithTimedOff::Type value;
            value.onOffControl = static_cast<chip::BitMask<chip::app::Clusters::OnOff::OnOffControl>>(1U);
            value.onTime       = 300U;
            value.offWaitTime  = 300U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::OnWithTimedOff::Id, value,
                               chip::NullOptional

            );
        }
        case 40: {
            LogStep(40, "Wait 10000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 41: {
            LogStep(41, "10b:Sends OnWithTimedOff command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::OnWithTimedOff::Type value;
            value.onOffControl = static_cast<chip::BitMask<chip::app::Clusters::OnOff::OnOffControl>>(1U);
            value.onTime       = 300U;
            value.offWaitTime  = 300U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::OnWithTimedOff::Id, value,
                               chip::NullOptional

            );
        }
        case 42: {
            LogStep(42, "Wait 10000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 43: {
            LogStep(43, "10c:Sends OnWithTimedOff command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::OnWithTimedOff::Type value;
            value.onOffControl = static_cast<chip::BitMask<chip::app::Clusters::OnOff::OnOffControl>>(1U);
            value.onTime       = 300U;
            value.offWaitTime  = 300U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::OnWithTimedOff::Id, value,
                               chip::NullOptional

            );
        }
        case 44: {
            LogStep(44, "Wait 10000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 45: {
            LogStep(45, "10d:Sends OnWithTimedOff command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::OnWithTimedOff::Type value;
            value.onOffControl = static_cast<chip::BitMask<chip::app::Clusters::OnOff::OnOffControl>>(1U);
            value.onTime       = 300U;
            value.offWaitTime  = 300U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::OnWithTimedOff::Id, value,
                               chip::NullOptional

            );
        }
        case 46: {
            LogStep(46, "10e:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 47: {
            LogStep(47, "10e:Reads OnTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4001 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnTime::Id, true,
                                 chip::NullOptional);
        }
        case 48: {
            LogStep(48, "10e:Reads OffWaitTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4002 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OffWaitTime::Id, true,
                                 chip::NullOptional);
        }
        case 49: {
            LogStep(49, "Wait 10000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 50: {
            LogStep(50, "11a:Sends OffWithEffect command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::OffWithEffect::Type value;
            value.effectId      = static_cast<chip::app::Clusters::OnOff::OnOffEffectIdentifier>(0);
            value.effectVariant = static_cast<chip::app::Clusters::OnOff::OnOffDelayedAllOffEffectVariant>(0);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::OffWithEffect::Id, value,
                               chip::NullOptional

            );
        }
        case 51: {
            LogStep(51, "11b:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 52: {
            LogStep(52, "11b:Reads OnTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4001 && OO.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnTime::Id, true,
                                 chip::NullOptional);
        }
        case 53: {
            LogStep(53, "11b:Reads OffWaitTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4002 && OO.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OffWaitTime::Id, true,
                                 chip::NullOptional);
        }
        case 54: {
            LogStep(54, "Wait 10000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 55: {
            LogStep(55, "12a:Sends OnWithTimedOff command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::OnWithTimedOff::Type value;
            value.onOffControl = static_cast<chip::BitMask<chip::app::Clusters::OnOff::OnOffControl>>(1U);
            value.onTime       = 300U;
            value.offWaitTime  = 300U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::OnWithTimedOff::Id, value,
                               chip::NullOptional

            );
        }
        case 56: {
            LogStep(56, "12b:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 57: {
            LogStep(57, "12b:Reads OnTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4001 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnTime::Id, true,
                                 chip::NullOptional);
        }
        case 58: {
            LogStep(58, "12b:Reads OffWaitTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4002 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OffWaitTime::Id, true,
                                 chip::NullOptional);
        }
        case 59: {
            LogStep(59, "Wait 10000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 60: {
            LogStep(60, "13a:Send On Command");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 61: {
            LogStep(61, "13b:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 62: {
            LogStep(62, "13b:Reads OnTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4001 && OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnTime::Id, true,
                                 chip::NullOptional);
        }
        case 63: {
            LogStep(63, "13b:Reads OffWaitTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4002 && OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OffWaitTime::Id, true,
                                 chip::NullOptional);
        }
        case 64: {
            LogStep(64, "Wait 10000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 65: {
            LogStep(65, "14a:Sends OnWithTimedOff command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::OnWithTimedOff::Type value;
            value.onOffControl = static_cast<chip::BitMask<chip::app::Clusters::OnOff::OnOffControl>>(1U);
            value.onTime       = 300U;
            value.offWaitTime  = 300U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::OnWithTimedOff::Id, value,
                               chip::NullOptional

            );
        }
        case 66: {
            LogStep(66, "Wait 10000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 67: {
            LogStep(67, "14b:Send Off Command");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 68: {
            LogStep(68, "14c:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 69: {
            LogStep(69, "14c:Reads OnTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4001 && OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnTime::Id, true,
                                 chip::NullOptional);
        }
        case 70: {
            LogStep(70, "14c:Reads OffWaitTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4002 && OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OffWaitTime::Id, true,
                                 chip::NullOptional);
        }
        case 71: {
            LogStep(71, "Wait 30000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 30000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 72: {
            LogStep(72, "15:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 73: {
            LogStep(73, "15:Reads OnTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnTime::Id, true,
                                 chip::NullOptional);
        }
        case 74: {
            LogStep(74, "15:Reads OffWaitTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OffWaitTime::Id, true,
                                 chip::NullOptional);
        }
        case 75: {
            LogStep(75, "Wait 10000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 76: {
            LogStep(76, "16a:Sends OnWithTimedOff command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::OnWithTimedOff::Type value;
            value.onOffControl = static_cast<chip::BitMask<chip::app::Clusters::OnOff::OnOffControl>>(1U);
            value.onTime       = 300U;
            value.offWaitTime  = 300U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::OnWithTimedOff::Id, value,
                               chip::NullOptional

            );
        }
        case 77: {
            LogStep(77, "16b:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 78: {
            LogStep(78, "16b:Reads OnTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4001 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnTime::Id, true,
                                 chip::NullOptional);
        }
        case 79: {
            LogStep(79, "16b:Reads OffWaitTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4002 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OffWaitTime::Id, true,
                                 chip::NullOptional);
        }
        case 80: {
            LogStep(80, "17a:Send On Command");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 81: {
            LogStep(81, "Wait 10000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 82: {
            LogStep(82, "17b:Sends OnWithTimedOff command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::OnWithTimedOff::Type value;
            value.onOffControl = static_cast<chip::BitMask<chip::app::Clusters::OnOff::OnOffControl>>(1U);
            value.onTime       = 300U;
            value.offWaitTime  = 300U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::OnWithTimedOff::Id, value,
                               chip::NullOptional

            );
        }
        case 83: {
            LogStep(83, "17c:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 84: {
            LogStep(84, "17c:Reads OnTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4001 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnTime::Id, true,
                                 chip::NullOptional);
        }
        case 85: {
            LogStep(85, "17c:Reads OffWaitTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4002 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OffWaitTime::Id, true,
                                 chip::NullOptional);
        }
        case 86: {
            LogStep(86, "Wait 40000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 40000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 87: {
            LogStep(87, "17d:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 88: {
            LogStep(88, "17d:Reads OnTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4001 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnTime::Id, true,
                                 chip::NullOptional);
        }
        case 89: {
            LogStep(89, "17d:Reads OffWaitTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4002 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OffWaitTime::Id, true,
                                 chip::NullOptional);
        }
        case 90: {
            LogStep(90, "Wait 10000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 91: {
            LogStep(91, "18a:Sends OnWithTimedOff command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::OnWithTimedOff::Type value;
            value.onOffControl = static_cast<chip::BitMask<chip::app::Clusters::OnOff::OnOffControl>>(0U);
            value.onTime       = 300U;
            value.offWaitTime  = 300U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::OnWithTimedOff::Id, value,
                               chip::NullOptional

            );
        }
        case 92: {
            LogStep(92, "18b:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 93: {
            LogStep(93, "18b:Reads OnTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4001 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnTime::Id, true,
                                 chip::NullOptional);
        }
        case 94: {
            LogStep(94, "18b:Reads OffWaitTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4002 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OffWaitTime::Id, true,
                                 chip::NullOptional);
        }
        case 95: {
            LogStep(95, "19a:Sends OnWithTimedOff command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::OnWithTimedOff::Type value;
            value.onOffControl = static_cast<chip::BitMask<chip::app::Clusters::OnOff::OnOffControl>>(0U);
            value.onTime       = 300U;
            value.offWaitTime  = 300U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::OnWithTimedOff::Id, value,
                               chip::NullOptional

            );
        }
        case 96: {
            LogStep(96, "Wait 10000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 97: {
            LogStep(97, "19b:Sends OnWithTimedOff command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::OnWithTimedOff::Type value;
            value.onOffControl = static_cast<chip::BitMask<chip::app::Clusters::OnOff::OnOffControl>>(0U);
            value.onTime       = 300U;
            value.offWaitTime  = 300U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::OnWithTimedOff::Id, value,
                               chip::NullOptional

            );
        }
        case 98: {
            LogStep(98, "Wait 10000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 99: {
            LogStep(99, "19c:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 100: {
            LogStep(100, "19c:Reads OnTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4001 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnTime::Id, true,
                                 chip::NullOptional);
        }
        case 101: {
            LogStep(101, "19c:Reads OffWaitTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4002 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OffWaitTime::Id, true,
                                 chip::NullOptional);
        }
        case 102: {
            LogStep(102, "20a:Send Off Command");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 103: {
            LogStep(103, "20b:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 104: {
            LogStep(104, "20b:Reads OnTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4001 && OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnTime::Id, true,
                                 chip::NullOptional);
        }
        case 105: {
            LogStep(105, "20b:Reads OffWaitTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4002 && OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OffWaitTime::Id, true,
                                 chip::NullOptional);
        }
        case 106: {
            LogStep(106, "21a:Sends OnWithTimedOff command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::OnWithTimedOff::Type value;
            value.onOffControl = static_cast<chip::BitMask<chip::app::Clusters::OnOff::OnOffControl>>(0U);
            value.onTime       = 300U;
            value.offWaitTime  = 300U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::OnWithTimedOff::Id, value,
                               chip::NullOptional

            );
        }
        case 107: {
            LogStep(107, "Wait 10000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 108: {
            LogStep(108, "21b:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 109: {
            LogStep(109, "21b:Reads OnTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4001 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnTime::Id, true,
                                 chip::NullOptional);
        }
        case 110: {
            LogStep(110, "21b:Reads OffWaitTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4002 && PICS_SKIP_SAMPLE_APP && OO.S.C42.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OffWaitTime::Id, true,
                                 chip::NullOptional);
        }
        case 111: {
            LogStep(111, "22a:Send On Command");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 112: {
            LogStep(112, "22b:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 113: {
            LogStep(113, "22b:Reads OnTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4001 && OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnTime::Id, true,
                                 chip::NullOptional);
        }
        case 114: {
            LogStep(114, "22b:Reads OffWaitTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4002 && OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OffWaitTime::Id, true,
                                 chip::NullOptional);
        }
        case 115: {
            LogStep(115, "Wait 10000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 116: {
            LogStep(116, "23a:Sends OnWithTimedOff command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::OnWithTimedOff::Type value;
            value.onOffControl = static_cast<chip::BitMask<chip::app::Clusters::OnOff::OnOffControl>>(0U);
            value.onTime       = 300U;
            value.offWaitTime  = 300U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::OnWithTimedOff::Id, value,
                               chip::NullOptional

            );
        }
        case 117: {
            LogStep(117, "23b:Send Off Command");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 118: {
            LogStep(118, "23c:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 119: {
            LogStep(119, "23c:Reads OnTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4001 && OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnTime::Id, true,
                                 chip::NullOptional);
        }
        case 120: {
            LogStep(120, "23c:Reads OffWaitTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4002 && OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OffWaitTime::Id, true,
                                 chip::NullOptional);
        }
        case 121: {
            LogStep(121, "Wait 40000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 40000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 122: {
            LogStep(122, "23d:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 123: {
            LogStep(123, "23d:Reads OnTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4001 && OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnTime::Id, true,
                                 chip::NullOptional);
        }
        case 124: {
            LogStep(124, "23d:Reads OffWaitTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4002 && OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OffWaitTime::Id, true,
                                 chip::NullOptional);
        }
        case 125: {
            LogStep(125, "24a:Sends OnWithTimedOff command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::OnWithTimedOff::Type value;
            value.onOffControl = static_cast<chip::BitMask<chip::app::Clusters::OnOff::OnOffControl>>(0U);
            value.onTime       = 300U;
            value.offWaitTime  = 300U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::OnWithTimedOff::Id, value,
                               chip::NullOptional

            );
        }
        case 126: {
            LogStep(126, "24b:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 127: {
            LogStep(127, "24b:Reads OnTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4001 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnTime::Id, true,
                                 chip::NullOptional);
        }
        case 128: {
            LogStep(128, "24b:Reads OffWaitTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4002 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OffWaitTime::Id, true,
                                 chip::NullOptional);
        }
        case 129: {
            LogStep(129, "Wait 40000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 40000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 130: {
            LogStep(130, "24c:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 131: {
            LogStep(131, "24c:Reads OnTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnTime::Id, true,
                                 chip::NullOptional);
        }
        case 132: {
            LogStep(132, "24c:Reads OffWaitTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OffWaitTime::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_OO_3_1Suite : public TestCommand
{
public:
    Test_TC_OO_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_OO_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_OO_3_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_OO_3_2Suite : public TestCommand
{
public:
    Test_TC_OO_3_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_OO_3_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_OO_3_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_RH_2_2Suite : public TestCommand
{
public:
    Test_TC_RH_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_RH_2_2", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_RH_2_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::app::DataModel::Nullable<uint16_t> ValueBeforeChange;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9999U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 10000U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 10000U));
                ValueBeforeChange = value;
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintNotValue("value", value, ValueBeforeChange));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Reads constraints of attribute: MinMeasuredValue");
            VerifyOrDo(!ShouldSkip("RH.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), RelativeHumidityMeasurement::Id,
                                 RelativeHumidityMeasurement::Attributes::MinMeasuredValue::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Reads constraints of attribute: MaxMeasuredValue");
            VerifyOrDo(!ShouldSkip("RH.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), RelativeHumidityMeasurement::Id,
                                 RelativeHumidityMeasurement::Attributes::MaxMeasuredValue::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Reads MeasuredValue attribute from DUT");
            VerifyOrDo(!ShouldSkip("RH.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), RelativeHumidityMeasurement::Id,
                                 RelativeHumidityMeasurement::Attributes::MeasuredValue::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Operate on device to change the relative humidity significantly");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && RH.M.ManuallyControlled"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "Read the mandatory attribute: MeasuredValue");
            VerifyOrDo(!ShouldSkip("RH.S.A0000 && RH.M.ManuallyControlled"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), RelativeHumidityMeasurement::Id,
                                 RelativeHumidityMeasurement::Attributes::MeasuredValue::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_RH_3_1Suite : public TestCommand
{
public:
    Test_TC_RH_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_RH_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_RH_3_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SWTCH_2_2Suite : public TestCommand
{
public:
    Test_TC_SWTCH_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SWTCH_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SWTCH_2_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SWTCH_3_1Suite : public TestCommand
{
public:
    Test_TC_SWTCH_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SWTCH_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SWTCH_3_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SWTCH_3_2Suite : public TestCommand
{
public:
    Test_TC_SWTCH_3_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SWTCH_3_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SWTCH_3_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_TMP_2_2Suite : public TestCommand
{
public:
    Test_TC_TMP_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_TMP_2_2", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_TMP_2_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::app::DataModel::Nullable<int16_t> valueBeforeChange;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -27315));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32766));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -27314));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -27314));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
                valueBeforeChange = value;
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -27314));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
                VerifyOrReturn(CheckConstraintNotValue("value", value, valueBeforeChange));
            }
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Read the mandatory attribute: MinMeasuredValue");
            VerifyOrDo(!ShouldSkip("TMP.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TemperatureMeasurement::Id,
                                 TemperatureMeasurement::Attributes::MinMeasuredValue::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the mandatory attribute: MaxMeasuredValue");
            VerifyOrDo(!ShouldSkip("TMP.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TemperatureMeasurement::Id,
                                 TemperatureMeasurement::Attributes::MaxMeasuredValue::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Reads MeasuredValue attribute from DUT");
            VerifyOrDo(!ShouldSkip("TMP.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TemperatureMeasurement::Id,
                                 TemperatureMeasurement::Attributes::MeasuredValue::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Operate on device to change the temperature significantly");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && TMP.M.ManuallyControlled"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "Read the mandatory attribute: MeasuredValue");
            VerifyOrDo(!ShouldSkip("TMP.S.A0000 && TMP.M.ManuallyControlled"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TemperatureMeasurement::Id,
                                 TemperatureMeasurement::Attributes::MeasuredValue::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_TMP_3_1Suite : public TestCommand
{
public:
    Test_TC_TMP_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_TMP_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_TMP_3_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_TSTAT_3_1Suite : public TestCommand
{
public:
    Test_TC_TSTAT_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_TSTAT_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_TSTAT_3_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_TSTAT_3_2Suite : public TestCommand
{
public:
    Test_TC_TSTAT_3_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_TSTAT_3_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_TSTAT_3_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_TSUIC_3_1Suite : public TestCommand
{
public:
    Test_TC_TSUIC_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_TSUIC_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_TSUIC_3_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGTHREAD_2_5Suite : public TestCommand
{
public:
    Test_TC_DGTHREAD_2_5Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_DGTHREAD_2_5", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGTHREAD_2_5Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGTHREAD_3_1Suite : public TestCommand
{
public:
    Test_TC_DGTHREAD_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_DGTHREAD_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGTHREAD_3_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGTHREAD_3_2Suite : public TestCommand
{
public:
    Test_TC_DGTHREAD_3_2Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_DGTHREAD_3_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGTHREAD_3_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGTHREAD_3_3Suite : public TestCommand
{
public:
    Test_TC_DGTHREAD_3_3Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_DGTHREAD_3_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGTHREAD_3_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGTHREAD_3_4Suite : public TestCommand
{
public:
    Test_TC_DGTHREAD_3_4Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_DGTHREAD_3_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGTHREAD_3_4Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGTHREAD_3_5Suite : public TestCommand
{
public:
    Test_TC_DGTHREAD_3_5Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_DGTHREAD_3_5", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGTHREAD_3_5Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ACT_2_1Suite : public TestCommand
{
public:
    Test_TC_ACT_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ACT_2_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ACT_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ACT_2_2Suite : public TestCommand
{
public:
    Test_TC_ACT_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ACT_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ACT_2_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ACT_3_1Suite : public TestCommand
{
public:
    Test_TC_ACT_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ACT_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ACT_3_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ACT_3_2Suite : public TestCommand
{
public:
    Test_TC_ACT_3_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ACT_3_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ACT_3_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_LTIME_1_1Suite : public TestCommand
{
public:
    Test_TC_LTIME_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LTIME_1_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_LTIME_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_LTIME_2_1Suite : public TestCommand
{
public:
    Test_TC_LTIME_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LTIME_2_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_LTIME_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_LTIME_3_1Suite : public TestCommand
{
public:
    Test_TC_LTIME_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LTIME_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_LTIME_3_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_LUNIT_1_1Suite : public TestCommand
{
public:
    Test_TC_LUNIT_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LUNIT_1_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_LUNIT_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_LUNIT_2_1Suite : public TestCommand
{
public:
    Test_TC_LUNIT_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LUNIT_2_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_LUNIT_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_LUNIT_3_1Suite : public TestCommand
{
public:
    Test_TC_LUNIT_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LUNIT_3_1", 9, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_LUNIT_3_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitLocalization::TempUnit value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitLocalization::TempUnit value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("temperatureUnit", value, 0U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitLocalization::TempUnit value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("temperatureUnit", value, 1U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitLocalization::TempUnit value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("temperatureUnit", value, 2U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "TH reads TemperatureUnit attribute from DUT");
            VerifyOrDo(!ShouldSkip("LUNIT.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), UnitLocalization::Id,
                                 UnitLocalization::Attributes::TemperatureUnit::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH writes 0 (Fahrenheit) to TemperatureUnit attribute");
            VerifyOrDo(!ShouldSkip("LUNIT.S.A0000 && LUNIT.TempUnit.Fahrenheit"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::UnitLocalization::TempUnit value;
            value = static_cast<chip::app::Clusters::UnitLocalization::TempUnit>(0);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), UnitLocalization::Id,
                                  UnitLocalization::Attributes::TemperatureUnit::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH reads TemperatureUnit attribute");
            VerifyOrDo(!ShouldSkip("LUNIT.S.A0000 && LUNIT.TempUnit.Fahrenheit"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), UnitLocalization::Id,
                                 UnitLocalization::Attributes::TemperatureUnit::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH writes 1 (Celsius) to TemperatureUnit attribute");
            VerifyOrDo(!ShouldSkip("LUNIT.S.A0000 && LUNIT.TempUnit.Celsius"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::UnitLocalization::TempUnit value;
            value = static_cast<chip::app::Clusters::UnitLocalization::TempUnit>(1);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), UnitLocalization::Id,
                                  UnitLocalization::Attributes::TemperatureUnit::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads TemperatureUnit attribute");
            VerifyOrDo(!ShouldSkip("LUNIT.S.A0000 && LUNIT.TempUnit.Celsius"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), UnitLocalization::Id,
                                 UnitLocalization::Attributes::TemperatureUnit::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH writes 2 (Kelvin) to TemperatureUnit attribute");
            VerifyOrDo(!ShouldSkip("LUNIT.S.A0000 && LUNIT.TempUnit.Kelvin"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::UnitLocalization::TempUnit value;
            value = static_cast<chip::app::Clusters::UnitLocalization::TempUnit>(2);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), UnitLocalization::Id,
                                  UnitLocalization::Attributes::TemperatureUnit::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH reads TemperatureUnit attribute");
            VerifyOrDo(!ShouldSkip("LUNIT.S.A0000 && LUNIT.TempUnit.Kelvin"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), UnitLocalization::Id,
                                 UnitLocalization::Attributes::TemperatureUnit::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH writes 5 to TemperatureUnit attribute");
            VerifyOrDo(!ShouldSkip("LUNIT.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::UnitLocalization::TempUnit value;
            value = static_cast<chip::app::Clusters::UnitLocalization::TempUnit>(5);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), UnitLocalization::Id,
                                  UnitLocalization::Attributes::TemperatureUnit::Id, value, chip::NullOptional, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_FLABEL_3_1Suite : public TestCommand
{
public:
    Test_TC_FLABEL_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_FLABEL_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_FLABEL_3_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BIND_2_1Suite : public TestCommand
{
public:
    Test_TC_BIND_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BIND_2_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BIND_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BIND_2_2Suite : public TestCommand
{
public:
    Test_TC_BIND_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BIND_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BIND_2_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BIND_2_3Suite : public TestCommand
{
public:
    Test_TC_BIND_2_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BIND_2_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BIND_2_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_S_1_1Suite : public TestCommand
{
public:
    Test_TC_S_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_S_1_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_S_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_S_2_1Suite : public TestCommand
{
public:
    Test_TC_S_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_S_2_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_S_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_S_2_2Suite : public TestCommand
{
public:
    Test_TC_S_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_S_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_S_2_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_S_2_3Suite : public TestCommand
{
public:
    Test_TC_S_2_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_S_2_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_S_2_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_S_3_1Suite : public TestCommand
{
public:
    Test_TC_S_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_S_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_S_3_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_PCC_3_1Suite : public TestCommand
{
public:
    Test_TC_PCC_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_PCC_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_PCC_3_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ACL_2_3Suite : public TestCommand
{
public:
    Test_TC_ACL_2_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ACL_2_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ACL_2_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ACL_2_4Suite : public TestCommand
{
public:
    Test_TC_ACL_2_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ACL_2_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ACL_2_4Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ACL_2_5Suite : public TestCommand
{
public:
    Test_TC_ACL_2_5Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ACL_2_5", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ACL_2_5Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ACL_2_6Suite : public TestCommand
{
public:
    Test_TC_ACL_2_6Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ACL_2_6", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ACL_2_6Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ACL_2_7Suite : public TestCommand
{
public:
    Test_TC_ACL_2_7Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ACL_2_7", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ACL_2_7Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ACL_2_8Suite : public TestCommand
{
public:
    Test_TC_ACL_2_8Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ACL_2_8", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ACL_2_8Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ACL_2_9Suite : public TestCommand
{
public:
    Test_TC_ACL_2_9Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ACL_2_9", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ACL_2_9Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ACL_2_10Suite : public TestCommand
{
public:
    Test_TC_ACL_2_10Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ACL_2_10", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ACL_2_10Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ULABEL_3_1Suite : public TestCommand
{
public:
    Test_TC_ULABEL_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ULABEL_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ULABEL_3_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BRBINFO_1_1Suite : public TestCommand
{
public:
    Test_TC_BRBINFO_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_BRBINFO_1_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BRBINFO_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BRBINFO_2_1Suite : public TestCommand
{
public:
    Test_TC_BRBINFO_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_BRBINFO_2_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BRBINFO_2_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BRBINFO_2_2Suite : public TestCommand
{
public:
    Test_TC_BRBINFO_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_BRBINFO_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BRBINFO_2_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BRBINFO_2_3Suite : public TestCommand
{
public:
    Test_TC_BRBINFO_2_3Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_BRBINFO_2_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BRBINFO_2_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ACE_1_1Suite : public TestCommand
{
public:
    Test_TC_ACE_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ACE_1_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ACE_1_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ACE_1_2Suite : public TestCommand
{
public:
    Test_TC_ACE_1_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ACE_1_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ACE_1_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(CHIP_NO_ERROR);
        }
    }

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        return CHIP_NO_ERROR;
    }
};

#endif // CONFIG_ENABLE_YAML_TESTS

void registerCommandsTests(Commands & commands, CredentialIssuerCommands * credsIssuerConfig)
{
    const char * clusterName = "Tests";

    commands_list clusterCommands = {
#if CONFIG_ENABLE_YAML_TESTS
        make_unique<TestList>(),
        make_unique<ManualTestList>(),
        make_unique<TestAccessControlClusterSuite>(credsIssuerConfig),
        make_unique<Test_TC_ACL_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_ACL_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_ACL_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_BOOL_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_BOOL_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_ACT_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_BIND_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_3_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_3_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_4_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_4_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_4_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_4_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_5_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_5_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_5_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_6_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_6_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_6_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_7_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_7_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_7_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_8_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_OPCREDS_1_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_BINFO_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_BINFO_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_CNET_1_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_DESC_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DLOG_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGETH_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGETH_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGETH_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_FLW_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_FLW_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_FLABEL_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_FLABEL_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_CGEN_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_CGEN_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGGEN_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGGEN_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_I_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_I_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_I_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_I_2_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_ILL_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_ILL_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_ILL_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_LVL_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_LVL_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_LVL_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_LVL_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_LVL_4_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_LVL_5_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_LVL_6_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_LCFG_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_LUNIT_1_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_LTIME_1_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_LOWPOWER_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_KEYPADINPUT_1_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_APPLAUNCHER_1_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_MEDIAINPUT_1_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_WAKEONLAN_1_5Suite>(credsIssuerConfig),
        make_unique<Test_TC_CHANNEL_1_6Suite>(credsIssuerConfig),
        make_unique<Test_TC_MEDIAPLAYBACK_1_7Suite>(credsIssuerConfig),
        make_unique<Test_TC_AUDIOOUTPUT_1_8Suite>(credsIssuerConfig),
        make_unique<Test_TC_TGTNAV_1_9Suite>(credsIssuerConfig),
        make_unique<Test_TC_TGTNAV_8_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_APBSC_1_10Suite>(credsIssuerConfig),
        make_unique<Test_TC_CONTENTLAUNCHER_1_11Suite>(credsIssuerConfig),
        make_unique<Test_TC_ALOGIN_1_12Suite>(credsIssuerConfig),
        make_unique<Test_TC_LOWPOWER_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_KEYPADINPUT_3_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_KEYPADINPUT_3_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_APPLAUNCHER_3_5Suite>(credsIssuerConfig),
        make_unique<Test_TC_APPLAUNCHER_3_6Suite>(credsIssuerConfig),
        make_unique<Test_TC_APPLAUNCHER_3_7Suite>(credsIssuerConfig),
        make_unique<Test_TC_APPLAUNCHER_3_8Suite>(credsIssuerConfig),
        make_unique<Test_TC_APPLAUNCHER_3_9Suite>(credsIssuerConfig),
        make_unique<Test_TC_MEDIAINPUT_3_10Suite>(credsIssuerConfig),
        make_unique<Test_TC_MEDIAINPUT_3_11Suite>(credsIssuerConfig),
        make_unique<Test_TC_MEDIAINPUT_3_12Suite>(credsIssuerConfig),
        make_unique<Test_TC_MEDIAINPUT_3_13Suite>(credsIssuerConfig),
        make_unique<Test_TC_CHANNEL_5_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_CHANNEL_5_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_CHANNEL_5_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_MEDIAPLAYBACK_6_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_MEDIAPLAYBACK_6_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_MEDIAPLAYBACK_6_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_MEDIAPLAYBACK_6_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_AUDIOOUTPUT_7_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_AUDIOOUTPUT_7_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_TGTNAV_8_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_APBSC_9_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_CONTENTLAUNCHER_10_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_MOD_1_1Suite>(credsIssuerConfig),
        make_unique<OTA_SuccessfulTransferSuite>(credsIssuerConfig),
        make_unique<Test_TC_OCC_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_OCC_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_OO_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_OO_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_OO_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_OO_2_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_PS_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_PS_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_PRS_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_PRS_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_PRS_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_PCC_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_PCC_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_PCC_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_PCC_2_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_PCC_2_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_PSCFG_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_PSCFG_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_RH_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_RH_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_SWTCH_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_SWTCH_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_TMP_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_TMP_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_TSTAT_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_TSTAT_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_TSTAT_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_TSUIC_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_TSUIC_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_TSUIC_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGTHREAD_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGTHREAD_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGTHREAD_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGTHREAD_2_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGTHREAD_2_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_ULABEL_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_ULABEL_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_ULABEL_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_ULABEL_2_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_ULABEL_2_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGWIFI_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGWIFI_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGWIFI_2_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_WNCV_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_WNCV_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_WNCV_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_WNCV_2_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_WNCV_2_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_WNCV_2_5Suite>(credsIssuerConfig),
        make_unique<Test_TC_WNCV_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_WNCV_3_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_WNCV_3_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_WNCV_3_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_WNCV_3_5Suite>(credsIssuerConfig),
        make_unique<Test_TC_WNCV_4_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_WNCV_4_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_WNCV_4_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_WNCV_4_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_WNCV_4_5Suite>(credsIssuerConfig),
        make_unique<TV_TargetNavigatorClusterSuite>(credsIssuerConfig),
        make_unique<TV_AudioOutputClusterSuite>(credsIssuerConfig),
        make_unique<TV_ApplicationLauncherClusterSuite>(credsIssuerConfig),
        make_unique<TV_KeypadInputClusterSuite>(credsIssuerConfig),
        make_unique<TV_AccountLoginClusterSuite>(credsIssuerConfig),
        make_unique<TV_WakeOnLanClusterSuite>(credsIssuerConfig),
        make_unique<TV_ApplicationBasicClusterSuite>(credsIssuerConfig),
        make_unique<TV_MediaPlaybackClusterSuite>(credsIssuerConfig),
        make_unique<TV_ChannelClusterSuite>(credsIssuerConfig),
        make_unique<TV_LowPowerClusterSuite>(credsIssuerConfig),
        make_unique<TV_ContentLauncherClusterSuite>(credsIssuerConfig),
        make_unique<TV_MediaInputClusterSuite>(credsIssuerConfig),
        make_unique<TestCASERecoverySuite>(credsIssuerConfig),
        make_unique<TestClusterSuite>(credsIssuerConfig),
        make_unique<TestClusterComplexTypesSuite>(credsIssuerConfig),
        make_unique<TestConstraintsSuite>(credsIssuerConfig),
        make_unique<TestDelayCommandsSuite>(credsIssuerConfig),
        make_unique<TestEventsSuite>(credsIssuerConfig),
        make_unique<TestDiscoverySuite>(credsIssuerConfig),
        make_unique<TestLogCommandsSuite>(credsIssuerConfig),
        make_unique<TestSaveAsSuite>(credsIssuerConfig),
        make_unique<TestConfigVariablesSuite>(credsIssuerConfig),
        make_unique<TestDescriptorClusterSuite>(credsIssuerConfig),
        make_unique<TestBasicInformationSuite>(credsIssuerConfig),
        make_unique<TestFabricRemovalWhileSubscribedSuite>(credsIssuerConfig),
        make_unique<TestGeneralCommissioningSuite>(credsIssuerConfig),
        make_unique<TestIdentifyClusterSuite>(credsIssuerConfig),
        make_unique<TestOperationalCredentialsClusterSuite>(credsIssuerConfig),
        make_unique<TestModeSelectClusterSuite>(credsIssuerConfig),
        make_unique<TestSelfFabricRemovalSuite>(credsIssuerConfig),
        make_unique<TestSystemCommandsSuite>(credsIssuerConfig),
        make_unique<TestBindingSuite>(credsIssuerConfig),
        make_unique<TestUserLabelClusterSuite>(credsIssuerConfig),
        make_unique<TestUserLabelClusterConstraintsSuite>(credsIssuerConfig),
        make_unique<TestArmFailSafeSuite>(credsIssuerConfig),
        make_unique<TestFanControlSuite>(credsIssuerConfig),
        make_unique<TestAccessControlConstraintsSuite>(credsIssuerConfig),
        make_unique<TestLevelControlWithOnOffDependencySuite>(credsIssuerConfig),
        make_unique<TestCommissioningWindowSuite>(credsIssuerConfig),
        make_unique<TestMultiAdminSuite>(credsIssuerConfig),
        make_unique<Test_TC_DGSW_1_1Suite>(credsIssuerConfig),
        make_unique<TestSubscribe_OnOffSuite>(credsIssuerConfig),
        make_unique<TestSubscribe_AdministratorCommissioningSuite>(credsIssuerConfig),
        make_unique<DL_UsersAndCredentialsSuite>(credsIssuerConfig),
        make_unique<DL_LockUnlockSuite>(credsIssuerConfig),
        make_unique<DL_SchedulesSuite>(credsIssuerConfig),
        make_unique<Test_TC_DRLK_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DRLK_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_DRLK_2_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_DRLK_2_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_DRLK_2_5Suite>(credsIssuerConfig),
        make_unique<Test_TC_DRLK_2_7Suite>(credsIssuerConfig),
        make_unique<Test_TC_DRLK_2_9Suite>(credsIssuerConfig),
        make_unique<TestGroupMessagingSuite>(credsIssuerConfig),
        make_unique<TestGroupsClusterSuite>(credsIssuerConfig),
        make_unique<TestGroupKeyManagementClusterSuite>(credsIssuerConfig),
        make_unique<Test_TC_G_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_G_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_1_5Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_1_6Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_1_7Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_1_8Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_1_9Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_1_10Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_1_11Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_1_12Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_1_13Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_1_14Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_1_15Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_3_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_3_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_3_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_3_5Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_3_6Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_3_7Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_3_8Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_3_9Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_3_10Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_3_11Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_3_12Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_3_13Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_3_14Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_3_15Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_3_16Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_3_17Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_3_18Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_3_19Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_3_20Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_3_21Suite>(credsIssuerConfig),
        make_unique<TestGroupDemoCommandSuite>(credsIssuerConfig),
        make_unique<TestGroupDemoConfigSuite>(credsIssuerConfig),
        make_unique<Test_TC_G_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_G_2_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_G_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_G_3_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_BDX_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_BDX_1_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_BDX_1_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_BDX_1_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_BDX_1_5Suite>(credsIssuerConfig),
        make_unique<Test_TC_BDX_1_6Suite>(credsIssuerConfig),
        make_unique<Test_TC_BDX_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_BDX_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_BDX_2_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_BDX_2_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_BDX_2_5Suite>(credsIssuerConfig),
        make_unique<Test_TC_BR_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_BR_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_BR_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_BR_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_DA_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DA_1_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_DA_1_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_DA_1_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_DA_1_5Suite>(credsIssuerConfig),
        make_unique<Test_TC_DA_1_6Suite>(credsIssuerConfig),
        make_unique<Test_TC_DA_1_7Suite>(credsIssuerConfig),
        make_unique<Test_TC_BINFO_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_BINFO_2_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_OPCREDS_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_OPCREDS_3_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_OPCREDS_3_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_OPCREDS_3_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_CNET_4_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_CNET_4_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_CNET_4_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_CNET_4_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_CNET_4_5Suite>(credsIssuerConfig),
        make_unique<Test_TC_CNET_4_6Suite>(credsIssuerConfig),
        make_unique<Test_TC_CNET_4_9Suite>(credsIssuerConfig),
        make_unique<Test_TC_CNET_4_10Suite>(credsIssuerConfig),
        make_unique<Test_TC_CNET_4_11Suite>(credsIssuerConfig),
        make_unique<Test_TC_CNET_4_12Suite>(credsIssuerConfig),
        make_unique<Test_TC_CNET_4_13Suite>(credsIssuerConfig),
        make_unique<Test_TC_CNET_4_14Suite>(credsIssuerConfig),
        make_unique<Test_TC_CNET_4_15Suite>(credsIssuerConfig),
        make_unique<Test_TC_CNET_4_16Suite>(credsIssuerConfig),
        make_unique<Test_TC_CNET_4_17Suite>(credsIssuerConfig),
        make_unique<Test_TC_CNET_4_18Suite>(credsIssuerConfig),
        make_unique<Test_TC_CNET_4_19Suite>(credsIssuerConfig),
        make_unique<Test_TC_CNET_4_20Suite>(credsIssuerConfig),
        make_unique<Test_TC_CNET_4_21Suite>(credsIssuerConfig),
        make_unique<Test_TC_CNET_4_22Suite>(credsIssuerConfig),
        make_unique<Test_TC_DLOG_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DLOG_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_DLOG_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DESC_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DESC_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGETH_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGETH_3_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_CGEN_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_CGEN_2_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGGEN_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGGEN_2_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGGEN_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_I_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_I_3_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_ILL_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_IDM_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_IDM_1_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_IDM_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_IDM_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_IDM_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_IDM_3_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_IDM_4_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_IDM_4_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_IDM_4_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_IDM_5_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_IDM_5_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_IDM_6_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_IDM_6_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_IDM_6_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_IDM_6_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_IDM_7_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_IDM_8_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_LOWPOWER_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_APPLAUNCHER_3_7_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_APPLAUNCHER_3_8_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_APPLAUNCHER_3_9_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_MEDIAINPUT_3_14Suite>(credsIssuerConfig),
        make_unique<Test_TC_MEDIAINPUT_3_15Suite>(credsIssuerConfig),
        make_unique<Test_TC_MEDIAINPUT_3_16Suite>(credsIssuerConfig),
        make_unique<Test_TC_MEDIAINPUT_3_17Suite>(credsIssuerConfig),
        make_unique<Test_TC_WAKEONLAN_4_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_CHANNEL_5_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_CHANNEL_5_5Suite>(credsIssuerConfig),
        make_unique<Test_TC_CHANNEL_5_6Suite>(credsIssuerConfig),
        make_unique<Test_TC_KEYPADINPUT_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_MEDIAPLAYBACK_6_5Suite>(credsIssuerConfig),
        make_unique<Test_TC_MEDIAPLAYBACK_6_7Suite>(credsIssuerConfig),
        make_unique<Test_TC_AUDIOOUTPUT_7_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_AUDIOOUTPUT_7_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_CONTENTLAUNCHER_10_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_CONTENTLAUNCHER_10_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_CONTENTLAUNCHER_10_5Suite>(credsIssuerConfig),
        make_unique<Test_TC_CONTENTLAUNCHER_10_7Suite>(credsIssuerConfig),
        make_unique<Test_TC_MC_11_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_MC_11_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_ALOGIN_12_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_ALOGIN_12_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_7Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_8Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_11Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_12Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_14Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_15Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_16Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_17Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_18Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_19Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_20Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_21Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_22Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_5Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_6Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_9Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_10Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_13Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_23Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_24Suite>(credsIssuerConfig),
        make_unique<Test_TC_MOD_1_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_MOD_1_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_MOD_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_MOD_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_MOD_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_MOD_3_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_MOD_3_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_MOD_3_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_SU_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_SU_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_SU_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_SU_2_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_SU_2_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_SU_2_5Suite>(credsIssuerConfig),
        make_unique<Test_TC_SU_2_6Suite>(credsIssuerConfig),
        make_unique<Test_TC_SU_2_7Suite>(credsIssuerConfig),
        make_unique<Test_TC_SU_2_8Suite>(credsIssuerConfig),
        make_unique<Test_TC_SU_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_SU_3_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_SU_3_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_SU_3_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_SU_4_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_SU_4_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_PSCFG_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_PSCFG_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_1_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_1_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_1_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_2_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_2_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_3_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_3_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_3_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_3_6Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_4_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_4_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_4_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_4_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_4_5Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_4_6Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_4_7Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_4_8Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_4_9Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_4_10Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_5_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_5_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_5_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_6_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGSW_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGSW_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGSW_2_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGSW_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGSW_3_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGWIFI_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGWIFI_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGWIFI_3_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_WNCV_6_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_WNCV_7_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_FLW_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_FLW_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_OCC_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_OCC_2_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_OCC_2_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_OCC_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_PRS_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_PS_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_PS_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_BOOL_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_BOOL_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_3_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_4_5Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_5_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_6_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_7_5Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_9_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_7_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_9_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_9_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_9_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_DRLK_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DRLK_2_6Suite>(credsIssuerConfig),
        make_unique<Test_TC_DRLK_2_8Suite>(credsIssuerConfig),
        make_unique<Test_TC_DRLK_2_10Suite>(credsIssuerConfig),
        make_unique<Test_TC_DRLK_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DRLK_3_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_DRLK_3_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_LCFG_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_LCFG_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_LVL_2_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_LVL_7_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_LVL_8_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_OO_2_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_OO_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_OO_3_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_RH_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_RH_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_SWTCH_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_SWTCH_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_SWTCH_3_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_TMP_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_TMP_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_TSTAT_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_TSTAT_3_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_TSUIC_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGTHREAD_2_5Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGTHREAD_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGTHREAD_3_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGTHREAD_3_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGTHREAD_3_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGTHREAD_3_5Suite>(credsIssuerConfig),
        make_unique<Test_TC_ACT_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_ACT_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_ACT_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_ACT_3_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_LTIME_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_LTIME_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_LTIME_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_LUNIT_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_LUNIT_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_LUNIT_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_FLABEL_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_BIND_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_BIND_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_BIND_2_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_S_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_S_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_S_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_S_2_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_S_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_PCC_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_ACL_2_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_ACL_2_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_ACL_2_5Suite>(credsIssuerConfig),
        make_unique<Test_TC_ACL_2_6Suite>(credsIssuerConfig),
        make_unique<Test_TC_ACL_2_7Suite>(credsIssuerConfig),
        make_unique<Test_TC_ACL_2_8Suite>(credsIssuerConfig),
        make_unique<Test_TC_ACL_2_9Suite>(credsIssuerConfig),
        make_unique<Test_TC_ACL_2_10Suite>(credsIssuerConfig),
        make_unique<Test_TC_ULABEL_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_BRBINFO_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_BRBINFO_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_BRBINFO_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_BRBINFO_2_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_ACE_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_ACE_1_2Suite>(credsIssuerConfig),
#endif // CONFIG_ENABLE_YAML_TESTS
    };

    commands.Register(clusterName, clusterCommands);
}
